Node.js
Socket.io

Socket.IO覚え書き(Room、joinまわり)

More than 5 years have passed since last update.

ちょっと改めて調べ直したので記録を残しておく。

Socket.IOには所謂チャットを作りやすくなるようなRoomという概念があって、これに入れる事で部屋の中の人にだけ通知をするようなことが可能になる。発言が部屋の中の人にだけ見えるようにするような場合には重宝する機能だと思う。

ざっくり下記を見ると雰囲気が掴める。
http://d.hatena.ne.jp/hekyou/20111222/p1

その上で一次情報の下記を確認すると良いだろう。
使っているメソッドの名前が少々違うけれどもそれ程問題なく読めた。
https://github.com/LearnBoost/socket.io/wiki/Rooms

自分の所では下記のような雰囲気のコードを書いてチェックしてみた。

    var server = http.createServer(app);
    server.listen(app.get('port'), function () {
        console.log("Express server listening on port " + app.get('port'));
    });

    var io = require('socket.io').listen(server);
    var chat = io.sockets.on('connection', function (socket) {

        socket.emit('news', { hello: 'world' });

        socket.on('my other event', function (data) {
            console.log(data);

            //試しに存在しないルームへemitしても何も起こらなかった
            chat.to('dummy1344').emit('これはテストです');

            console.log('rooms:', io.sockets.manager.rooms);
            socket.join('testroom');
            console.log('rooms(after join):', io.sockets.manager.rooms);
            socket.join('testroom2');
            console.log('rooms(after join2):', io.sockets.manager.rooms);
            console.log(io.sockets.manager.roomClients[socket.id]);
        });

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

ログには下記のように出る。io.sockets.manager.roomsの「''」キーに全てのクライアント、その下にそれぞれのルームが繋がるようになるようだ。ルートとルームの両方に属する事が出来る様子。複数のルームに属する事も可能な様子だ。

{ my: 'data' }
rooms: { '': [ '9EoaNBJ-vUF1ykx8524a' ] }
rooms(after join): { '': [ '9EoaNBJ-vUF1ykx8524a' ],
  '/testroom': [ '9EoaNBJ-vUF1ykx8524a' ] }
rooms(after join2): { '': [ '9EoaNBJ-vUF1ykx8524a' ],
  '/testroom': [ '9EoaNBJ-vUF1ykx8524a' ],
  '/testroom2': [ '9EoaNBJ-vUF1ykx8524a' ] }
{ '': true, '/testroom': true, '/testroom2': true }

単純にタグ付けを行っているような雰囲気になっていて、関連付けをするような仕組みではない様子。例えば「今属している全てのルームへemitする」というような上位レベルのメソッドは用意されていないようだ。io.sockets.manager.roomClients[socket.id]で全ての所属しているルームを得ることができる。