iocatでSocket.IOのサーバをデバッグする

Socket.IOで立てたWebSocketサーバをiocatコマンドでデバッグする方法について。

iocatとiocat内部で使うsocket.io-clientをグローバルにインストールする。

$ npm install -g iocat socket.io-client

適当なSocket.IOサーバを書く。

var io = require('socket.io')(3000);

io.on('connection', function(socket) {
  log('connection');

  socket.on('open', function() {
    console.log('open');
    console.log(arguments);
  });

  socket.on('message', function() {
    console.log('message');
    console.log(arguments);
  });

  socket.on('disconnect', function() {
    console.log('disconnect');
  });
});

サーバはDEBUG環境変数を付けて起動するといろいろな情報が見れるので良い。

$ DEBUG=* node server.js

iocatでサーバに接続する。Socket.IOのサーバに接続するので、--socketioが必要。

$ iocat -v --socketio ws://127.0.0.1:3000
> SIOClient> SIOClient: url-> ws://127.0.0.1:3000
SIOClient> onConnect

iocatからメッセージを送ってみる。接続直後はプロンプトに>が表示されない。

> message
SIOClient> send message

サーバ側にはconsole.logで出力したログ(と、その他DEBUGで指定したログ)が表示されているはず。

message
{ '0' : 'message' }

ただ、iocatでは送信できるものがmessage固定となっているらしく、上のコードでのopenは送れない。(自分がmessage以外で送る方法を知らないかもしれないが)

グローバルにsocket.io-clientもインストールしているので、socket.io-clientを使って直接メッセージを送信する方が良いのかもしれない。

$ node
> var io = require('socket.io-client')('http://127.0.0.1:3000');
undefined
> io.emit('open');
...

サーバ側にログが出力される。

open
{}

iocatのソースコードも読んでみたのだけど、message以外で送る方法がわからなかった。そもそもそういうものではないのかな。