29

我有一个 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(''),当然它不再与命名空间匹配。
  • 这意味着我应该使用房间,但我想知道房间和命名空间之间的语义区别是什么。

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

4

2 回答 2

30

您可能正在使用房间,因此您将执行以下操作以向房间中的每个人发出

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

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

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

你也可以使用命名空间:

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

要向除触发您的用户之外的所有人发出,您将使用:

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

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

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

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

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

可能有一种解决方法,您可以在其中广播到所有命名空间(下面的示例)。但简而言之,您不应该这样做,您应该使用房间。

for (var nameSpace in io.sockets.manager.namespaces){
  io.of(nameSpace).emit("messageToAll", message);
}
于 2012-11-22T02:35:51.143 回答
4

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

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!");
  };
}

你可以自己写其他句柄:)

于 2014-08-04T06:01:40.867 回答