Socket.io:命名空间,渠道和合作

我有一个Node.js Web服务器,它运行一个使用Socket.io创build的顶层套接字服务器。 基本上,这工作。

我现在想要实现的是,连接的客户端被分组。 所以可能会有一些组成A组的客户和其他一些组成B组的客户。他们应该通过特定的URL( localhost:3000/Alocalhost:3000/B来select他们属于哪个组。

在Socket.io中,我现在想发送消息给A组中的所有客户端,或者B组中的所有客户端或所有客户端,而不必查看他们的组。

这基本上就像是和房间聊天,你可以给特定房间内的所有客户或任何客户留言,不pipe他在哪个房间。

使用Socket.iodevise这样一个系统的最佳方法是什么?

到目前为止,我一直在尝试使用命名空间,这基本上可以创build组A和B,但是我无法将消息发送到所有客户端,无论他们在哪个房间。至less我不知道该怎么做这个。

我应该如何build模? 什么是我应该寻找的正确的条件?

更新:根据@sdedelbrock的答案,我可以使用命名空间或房间:

  • 如果使用命名空间,我不能长时间发送给每个人,不pipe他们的命名空间。 这是因为io.socketsio.of('')的快捷方式,当然这与命名空间不再匹配。
  • 这意味着我应该使用房间,但是我想知道房间和命名空间之间的语义差异是什么。

简而言之:为什么同一个(?)想法有两个概念?

你可能会使用房间,所以你会做以下发射给房间里的每个人

 io.sockets.in('a').emit('inA', 'foo') 

然后发射给大家,你可以使用

 io.sockets.emit('everyone','bar'); 

你也可以使用命名空间:

 io.of('/b').emit('inB', 'buzz'); 

要发送给除触发了您的用户将使用的所有人:

 io.sockets.broadcast.emit("hello"); 

这里有一个更详细的答案:

name-spacing背后的思想是它与其他命名空间(甚至是全局的)分开处理。 把它看作是一个全新的socket.io实例,你可以运行新的握手,新鲜的事件,授权等,而不会有不同的命名空间相互干扰。

这对于说/chat/tracking连接事件将具有非常不同的逻辑是有用的

Socket.io为你做所有的工作,就好像它是两个单独的实例一样,但仍然将信息限制在一个连接上,这非常聪明。

可能有一个解决方法,你可以广播到所有的命名空间(下面的例子)。 但总之你不应该这样做,你应该使用房间。

 for (var nameSpace in io.sockets.manager.namespaces){ io.of(nameSpace).emit("messageToAll", message); } 

这是一个可以使用的模板应用程序(适用于9.16;未在1.x上testing,但应该可以):

 var namespaces = [ io.of('/ns1'), io.of('/ns2'), io.of('/ns3') ]; for (i in namespaces) { namespaces[i].on('connection',handleConnection(namespaces[i])); } function handleConnection(ns) { return function (socket){ //connection console.log("connected "); socket.on('setUsername',setUsernameCallback(socket,ns)); socket.on('disconnect', disconnectCallback(socket,ns)); socket.on('messageChat',messageChatCallback(socket,ns)); socket.on('createJoinRoom',createJoinRoomCallback(socket,ns)); }; } function disconnectCallback(socket,ns) { return function(msg){ console.log("Disconnected "); socket.broadcast.send("It works!"); }; } 

你可以自己写其他的手柄:)