Node.jsでブラウザを使わないWebSocketクライアント
Node.jsを使い始めたのは、WebSocketを使ってごにょごにょしたいからだった。通常と少し違うのは、WebSocketのクライアント側がブラウザでは無いこと。それを実現するにはどうしたら良いか調べた。
Node.jsでWebSocketを使うには
Node.jsでWebSocketを使う場合、Socket.IOというモジュールを使うのが一般的らしい。厳密にいうと、Socket.IOはクライアントのブラウザがWebSocketをサポートしていない場合、自動で他の手段で代替してくれるとのこと。
本家
Socket.IO: the cross-browser WebSocket for realtime apps.
日本語版ページ
Socket.IO: the cross-browser WebSocket for realtime apps.
Node.jsのモジュールは、npmコマンドでインストールできる。Socket.IOのモジュールをインストールするには、下記のコマンドになる。
$ npm install socket.io
これだけで、特に引っかかることなく、Soket.IOのサンプルコードを動かすことができた。
なんか、ものすごく簡単ですね。この使いやすさが広く使われている理由のひとつなのかな。
ただし、これらのサンプルは、全てクライアントがブラウザであることを想定したものばかり。自分としては、クライアント側もNode.jsオンリーで書きたい。どうすれば良いか?
ブラウザを使わないSocket.IOのクライアント
世の中には、大体同じようなことを考えている人がいるもので、「node socket.io client no browser」というキーワードでググッたらすぐに答えが出てきた。
socket.io-clientというものを使えば良いらしい。
早速、モジュールをインストールしてみる。
$ npm install socket.io-client
で、↑のリンクにあったサンプルコードを動かしてみる。
まず、サーバー側(socket_server.js)
var io = require('socket.io').listen(8080);
io.sockets.on('connection', function (socket) {
socket.emit('news', {hello: 'world'});
socket.on('my other evenr', function (data) {
console.log(data);
});
});
クライアント側(socket_client.js)
var io = require('socket.io-client');
var socket = io.connect('http://localhost:8080');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other evenr', {my: 'data'});
});
実行結果
$ node socket_server.js
info - socket.io started
debug - client authorized
info - handshake authorized pl-ax4lmk3PJB8ai5fQd
debug - setting request GET /socket.io/1/websocket/pl-ax4lmk3PJB8ai5fQd
debug - set heartbeat interval for client pl-ax4lmk3PJB8ai5fQd
debug - client authorized for
debug - websocket writing 1::
debug - websocket writing 5:::{"name":"news","args":[{"hello":"world"}]}
{ my: 'data' }
$ node socket_client.js
{ hello: 'world' }
これまた、簡単にできた。
次は、クライアントAとクライアントBの間で、WebSocketサーバー経由でデータのやり取りをしたい。これは、Socket.IOの名前空間を使えば、実現できそうな気がする。