基本概念看socketio官方文档 http://socket.io/docs/rooms-and-namespaces/
namespace 和room的概念其实用来同一个服务端socket多路复用的。namespace,room和socketio的关系如下。
socket会属于某一个room,如果没有指定,那么会有一个default的room。这个room又会属于某个namespace,如果没有指定,那么就是默认的namespace /.
最后socketio有用所有的namespace。
客户端连接时指定自己属于哪个namespace, io.connect( http://localhost/namespace)。 服务端看到namespace就会把这个socket加入指定的namespace。
如果客户端没有具体指定哪个room,则服务端会放入默认room中,或者服务端通过代码socket.join("rbar") 放入 bar的room中。
有了这个概念之后,就比较好理解socketio是如何广播的,广播的时候是以namespace为单位的,如果只想广播给某个room,那就需要另外指定room的名字。
socketio.send("send to the clients which belong to default namespace(/)");
这个调用没有指定namespace和room,那么这个广播的对象就是 广播给默认namespace / 和默认room。 如果你的客户端连接到服务器的path是 http://localhost/bar,
客户端是属于bar namespace,那么这个客户端就收不到这个消息。只有那些path是 http://localhost的才能收到。
socket.broadcast.emit('message', "send to the clients which belong to namespace(socket belong to) except sender");
通过socket广播时,是广播给这个socket所属的 namespace里的所有客户端。只有跟socket同一个namespace里的客户端才能收到数据。
socket.broadcast.in('chat).emit('message', "send to the clients which belong to namespace(socket belong to) except sender");
广播给跟socket同一个namespace下面的,名字为 chat的room里的除自己以外的客户端。
socketio.of('/private').send("send to all the clients which belong to namespace(priavte)");
发给 private namespace里的所有客户端。
socketio.of('/private').in('chat').send("send to all the clients in the chat room which belong to namespace(private)");
发给private namespace里面的 chat room的所有客户端。
记忆这些函数也比较容易 ,如果是socket开头的,那么namespace已经指定,只能修改room。如果是socketio开头的,那么可以指定namesapce和room。
如果没有任何指定,那就是默认的namespace和默认的room。