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のサンプルコードを動かすことができた。

http://socket.io/#how-to-use

 

なんか、ものすごく簡単ですね。この使いやすさが広く使われている理由のひとつなのかな。 

ただし、これらのサンプルは、全てクライアントがブラウザであることを想定したものばかり。自分としては、クライアント側もNode.jsオンリーで書きたい。どうすれば良いか?

ブラウザを使わないSocket.IOのクライアント

世の中には、大体同じようなことを考えている人がいるもので、「node socket.io client no browser」というキーワードでググッたらすぐに答えが出てきた。

 

Added preliminary support for socket.io-client to work from node.js by josephg · Pull Request #240 · LearnBoost/socket.io-client · GitHub

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の名前空間を使えば、実現できそうな気がする。