node.js - socket.io - Chat Room - NameSpace - 名前空間 | emitの範囲 を分ける方法まとめ
必要なメソッド : to , join , leave, of , clients
tips1 : namespaceについてはsocket.ioのHow To Useページを参照
tips2 : toを使うとidにjoinしたメンバーだけに送られる
tips3 : clientsメソッドでroomidにjoinしているメンバーのsocketが得られる
tips4 : leaveでroomから出る
tips3については先日のnode.js - socket.io - rails - sessionを共有する方法で紹介したsessionの保存と合わせて
roomにjoinしているメンバーのhandshakeデータからセッションデータを引っ張ってこれます。
下記はcoffeescriptのソースになります。
Client
#util p = (data)-> console.log data #channel class Channel constructor : (@roomid)-> #tips1 @sock = io.connect(youriohost + '/channels') @sock.emit('join',@roomid) #tips2 @sock.on 'room message',(msg) -> p msg #*tips3 @sock.on 'members in room',(members) -> p members sendMessage : (message) -> @sock.emit('sendMessage',@roomid,message) channel = new Channel(roomid) channel.sendMessage("only roomid's member can listen")
Server
io = require('socket.io').listen(3002) connect = require('connect') util = require('util') #tips1 channel = io.of('/channels').on 'connection', (sock) -> sock.on 'join',(roomid) -> sock.join(roomid) sock.set('roomid',roomid) #*tips3 sock.emit('members in room',channel.findRoomClients(roomid)) sock.on 'sendMessage',(id,message) -> #tips2 channel.to(id).emit('room message',message) sock.on 'disconnect' , () -> sock.get 'roomid',(err,roomid) -> #tips4 sock.leave(roomid) #*tips3 channel.findRoomClients = (roomid)-> this.clients(roomid).map (client) -> client.what_you_want client.handshake.session.id client.handshake.session.name