socket.io 中namespace 和 room的概念。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lijiecong/article/details/50781417

       基本概念看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。




 






展开阅读全文

没有更多推荐了,返回首页