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
結構夢が広がると思います。