socket.io には NameSpace と Room という機能がある。
NameSpace … 機能単位で分ける
Room ... NameSpace内のカテゴリーという位置づけ。
チャットシステムを作る時に機能が
「全社チャット」「部署チャット」「フリートーク」の3つだった場合は
「全社チャット」「部署チャット」「フリートーク」の各機能ごとにNameSpaceを定義して、
それぞれのNameSpaceにはグループ機能がある場合に
グループ自体をRoomで管理する感じ。
【名前空間】
chatという名前空間を定義してみる。
of()で定義するだけ。
--------------------
var io = require('socket.io').listen(server);
var chatNS = io.of('/chat');
chatNS.on('connection', function(socket){
});
-------------------
クライアント側は接続時に明示的に名前空間を指定する必要がある。
ここでの指定によって http://192.168.33.10:3000/chat というURLが利用できなくなるわけではない。
あくまで名前空間の指定方法。
----------
var chatRoom = io('http://192.168.33.10:3000/chat');
----------
名前空間はこれだけでOK。
ちなみに、名前空間を指定しなければデフォルトの名前空間「/」が使われているので、
特別な操作は不要。
【ルーム】
以下に操作をまとめる。
chatNS.on('connection', function(socket){ var roomName = 'my_room'; //入室 socket.join(roomName); //ルームに存在するsocketID一覧 console.log(chatNS.adapter.rooms[roomName]); //ルームの全メンバーへメッセージ送信 chatNS.to(roomName).emit('msg', 'room message'); //socketIDは socket.io が接続ユーザーをユニークに判別するためのID var socketId = socket.id; //特定ユーザーへのメッセージ送信 // to() はルーム名とsocketID両方を指定できる。 // socketIDを指定した場合は特定ユーザーへのメッセージになる。 chatNS.to(socketId).emit('msg', 'user message'); //退室 socket.leave(roomName); //ちなみに、これは全ルームにPUSH(全ユーザーにPUSH) chatNS.emit('msg', 'all user message'); });
ルーム名、socketID、ユーザー名のヒモ付はアプリケーション上で管理しておく必要がある。
socket.io はプロセス間通信ができないので、
異なるプロセスに対するメッセージ送信には socket.io-redis を使う必要がある。
https://github.com/automattic/socket.io-redis