Socket.io:Namespaces,channels&co

Gol*_*den 29 namespaces channel node.js socket.io

我有一个Node.js Web服务器在顶部运行套接字服务器,它是使用Socket.io创建的.基本上,这是有效的.

我现在想要实现的是连接的客户端是成组聚集的.因此,可能有一些客户构成组A和组成组B的其他一些客户.他们应通过寻址特定URL来选择他们所属的组,localhost:3000/A或者localhost:3000/B.

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

它基本上就像与房间聊天一样,无论他在哪个房间,您都可以为特定房间内的所有客户或任何客户提供消息.

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

到目前为止,我一直在尝试使用命名空间,这基本上可以用于创建组A和B,但是我失去了向所有客户端发送消息的能力,无论他们在哪个房间.至少我不知道该怎么做这个.

我该如何塑造这个?我应该寻找哪些合适的术语?

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

  • 如果使用命名空间,我无法向所有人发送,无论其命名空间如何.这是因为它io.sockets是一个快捷方式io.of(''),当然它不再与命名空间匹配.
  • 这意味着我应该使用房间,但我想知道房间和命名空间之间的语义差异是什么.

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

Sde*_*ock 30

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

io.sockets.in('a').emit('inA', 'foo')
Run Code Online (Sandbox Code Playgroud)

然后发给你可以使用的每个人

io.sockets.emit('everyone','bar');
Run Code Online (Sandbox Code Playgroud)

您也可以使用名称空间:

io.of('/b').emit('inB', 'buzz');
Run Code Online (Sandbox Code Playgroud)

要向除触发您的用户以外的所有人发出以下内容:

io.sockets.broadcast.emit("hello");
Run Code Online (Sandbox Code Playgroud)

[edit]这是一个更详细的答案:

名称间距背后的想法是它与其他名称空间(甚至全局)分开处理.可以把它想象成一个全新的socket.io实例,你可以运行新的握手,新事件,授权等,而不会让不同的命名空间相互干扰.

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

Socket.io为您完成所有工作,就好像它是两个独立的实例,但仍然将信息限制为一个连接,这非常聪明.

可能有一种解决方法,您可以在其中广播所有命名空间(如下所示).但总之,你不应该这样做,你应该使用房间.

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

  • 这个`io.sockets.broadcast.emit`不正确,`broadcast`需要知道哪个socketID要排除/忽略发出,所以你有两个选择:1)来自全局io - >`io.sockets.in(namespace) .socket(socketID).broadcast.emit("hello")`或2)来自socket - >`socket.broadcast.emit("hello")` (2认同)