話題の記事

node.jsのいろいろなモジュール16 – socket.io-clientで同時接続のテストとか

2013.02.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

socket.io-client

socket.ioはWebsocketやHTTPポーリング等、適切な接続を自動的に切り替えて双方向通信を実現してくれるライブラリです。
そしてsocket.io-clientはsocket.ioでサーバへ接続するためのクライアント用ライブラリです。
これを使用すればコンソールから複数のsocket.io接続をテストすることができます。
今回はこのsocket.io-clientを使って、コンソールからsocket.io接続を行なってみましょう。

環境構築

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.4
  • Node.js : v0.8.15
  • npm : 1.1.66

適当なディレクトリを作成し、そこでnpmを使用してsocket.ioとsocket.io-clientをインストールしましょう。

% mkdir client
% cd client
% npm install socket.io socket.io-client

socket.ioを使ったサーバアプリを作成

まずはシンプルなsocket.ioを使ったアプリを作成します。app.jsという名前で下記javascriptを作成しましょう。
このアプリケーションはsocket.ioの接続時と切断時にメッセージを表示します。
また、sendMsgFromClientイベントを受け取ると、そのイベントでうけとったメッセージをブロードキャストします。

var http = require('http');
//サーバインスタンス作成
var server = http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type':'text/html'});
        res.end('server connected');
});
var io = require('socket.io').listen(server);
var counter = 0;//接続数のカウンタ
server.listen(3000);//3000番ポートで起動

//接続確立時の処理
io.sockets.on('connection', function (socket) {
    counter++;
    console.log("counter:" + counter);
    //sendMsgFromClientイベントを受けたらメッセージをブロードキャスト
    socket.on('sendMsgFromClient', function(msg) {
        io.sockets.emit('sendMsgFromServer', '[Hello From Server]msg=' + msg);
    });
    //切断時の処理
    socket.on('disconnect', function () {
        //disconnect
        counter--;
        console.log('disconnect.cout: ',counter);
    });
});

socket.io-clientを使ったクライアントアプリを作成

サーバサイドができたので、次はsocket.io-clientを使ってクライアントアプリを作成します。
client.jsという名前でjavascriptファイルを作成して次のような記述をしましょう。

var io = require('socket.io-client');
var url = "localhost";
var options = {
    'force new connection':true,
    port:3000
};

まずはsocket.io-clientをrequireします。optionはclient接続時に渡すオプションです。
force new connectionをtrueにしておくと、同一マシンからの複数接続が別のものと判断されます。

次にio.connectでmaxConnectの数だけsocket.io接続を行います。
接続時のイベントでメッセージを表示、sendMsgFromServerイベントを受け取った時もクライアント側でメッセージを表示します。

//最大接続ユーザ数 var maxConnect = 5; //接続しているユーザ数 var connectCounter = 0;

var socket; for(var i = 0 ;i < maxConnect; i++) { socket = io.connect(url, options); socket.on('connect', function (data) { connectCounter += 1; console.log("connect. connectCounter=" + connectCounter); }); socket.on('sendMsgFromServer', function (msg) { console.log("message:",msg); }); } setTimeout(function(){ socket.emit("sendMsgFromClient","send client msg"); },3000); [/javascript]

最後に、socket.io接続の約3秒後にクライアントの1つからsendMsgFromClientイベントを送信しています。
ここまでclient.jsに記述できたら、app.jsを起動し、別ウィンドウでclient.jsを起動してみてください。

接続方式を指定する

socket.ioはいろいろな接続方式に対応してます。v0.9の場合、デフォルトでは最初にwebsocketを使用して接続を試みます。
もし任意の接続方式を試したい場合、transportsプロパティに値を設定すれば、指定した方法で接続を行なってくれます。

//client.js var io = require('socket.io-client'); io.transports = ['xhr-polling'];//<-ポーリング方式でsocket.io接続 ・ ・ [/javascript]

上記のようにtransportsを設定すれば、xhrでsocket.io接続をします。

まとめ

今回はsocket.io用クライアントライブラリについて紹介しました。
socket.ioで多数の接続をテストしたい場合などに必須となるライブラリですね。
なお、1000クライアント以上の接続を試したい場合、OSのファイルディスクリプタの上限を上げる必要があるかもしれません。
このあたりに詳しい情報があるので、参考にしてください。

参考サイトなど