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