ikeike443のブログ

ソフトウェアビジネスに関心がある系のブログ

socket.io-clientがnode.jsから呼び出せるようになってた

下記のコミットで出来るようになってる。
https://github.com/LearnBoost/socket.io-client/pull/274


バージョン的には0.7.5から。
今なら下記のようにnpmからインストールすれば使えるようになってる。

$ npm install socket.io-client


ちなみにsocket.ioっていうのは、websocketおよびそれっぽい何かを使って、プッシュ通信をクロスブラウザで実現しようというライブラリ。ステキやん。
http://socket.io/

準備

インストールしたら、まずサーバサイドを下記のように書く(要express/ejs)。
このコードはどなたかのブログを参考にさせていただいたものです。(すいません。どなたのものだったか忘れました。。)

hello.js
var express = require('express');
var app = express.createServer();
app.get('/', function(req, res) {
	res.render('index.ejs', {
		layout : false,
		locals : {
			name : req.param('name') || 'anonymous'
		}
	});
});
app.listen(3000);
console.log('Server running at http://127.0.0.1:3000/');
var io = require('socket.io').listen(app);
io.sockets.on('connection', function(client) {
	client.on('message', function(msg) {
		client.send(msg);
		client.broadcast.emit('message', msg);
	});
});
views/index.ejs
<html>
  <head>
    <title>hello node.js!</title>
  </head>
  <body>
    I'm <span id="name"><%= name %></span>.<br />
    <form onsubmit="return send();">
      <input type="text" name="message" id="message"/>
      <input type="submit" />
    </form>
    <script type="text/javascript" src="/socket.io/socket.io.js"></script>
    <script type="text/javascript">
      var socket = io.connect();
      socket.on('message', function(msg) {
        var div = document.createElement('div');
        div.appendChild(document.createTextNode(msg));
        document.body.appendChild(div);
      });
      function send() {
        var message = document.getElementById('message');
        socket.send(document.getElementById('name').innerText + ': ' + message.value);
        message.value = '';
        return false;
      }
    </script>
  </body>
</html>


上記までだと、node.jsをサーバとして使い、クライアントはHTMLのscriptタグ中のJavascriptとなる。
これに加えて、今回のバージョンアップで、クライアントをnode.jsで書くことが出来るようになった。


例えば下記のように書けばいい。

nodeclient.js
var client = require('socket.io-client');
var socket = client.connect('http://localhost:3000');
socket.on('connect',function(){
    console.log('yea!!');
    socket.send('how are you?');
    socket.disconnect();
    process.exit(0);
});

試し方

まずサーバを起動するため、下記コマンド。

$ node hello.js


サーバが起動して普通のチャットアプリとして動くことを確認したら、次におもむろに下記コマンドを実行。

$ node nodeclient.js


すると、ブラウザ側にメッセージがプッシュされる。
これって要はクライアントからの入力がなくても、サーバサイドからブラウザに向けてプッシュでメッセージを送れるってことですよね。


下記にデモ動画をアップしてみた。

http://f.hatena.ne.jp/ikeike443/20110809011059

結構夢が広がると思います。