当前位置: 首页 > 面试题库 >

Socket.io:命名空间,通道和联合

井旺
2023-03-14
问题内容

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

我现在想要实现的是将连接的客户端按组进行群集。所以可能有一些客户从而弥补了A组和其他一些客户从而弥补了B组,他们将选择哪个组由他们一adressing特定的URL,无论是属于localhost:3000/Alocalhost:3000/B

现在,在Socket.io中,我希望将消息发送到A组中的所有客户端或B组中的所有客户端或所有客户端,而无需查看它们的组。

基本上就像与房间聊天一样,您可以向特定房间内的所有客户发送消息,也可以向任何客户发送消息,无论他在哪个房间。

使用Socket.iohtml" target="_blank">设计此类系统的最佳方法是什么?

到目前为止,我一直在尝试使用命名空间,该命名空间基本上可以用于创建A组和B组,但是后来我无法向所有客户端发送消息,无论它们处于什么空间。至少我不知道该怎么做这个。

我应该如何建模?我应该寻找什么正确的术语?

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

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

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


问题答案:

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

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


 类似资料:
  • 问题内容: 我正在研究nodejs / socket.io的实时聊天,并且需要一些有关实施会议室的建议。 使用名称空间或使用房间功能来完全隔离颤抖的对方,哪个更好? 房间和名称空间之间真正的技术区别是什么? 资源使用方面有区别吗? 问题答案: 这是名称空间和房间 的共同点 (socket.io v0.9.8-请注意,v1.0涉及完整的重写,因此情况可能有所更改): 命名空间(io.of(’/ ns

  • 内联命名空间旨在通过”版本”的概念,来实现库的演化。考虑如下代码: // 文件:V99.h inline namespace V99 { void f(int); // 对V98版本进行改进 void f(double); // 新特性 // … } // 文件:V98.h namespace V98 { void

  • gcc和msvc无法编译这段代码,错误消息< code >命名空间范围的匿名聚合必须是静态的。但是clang编译这个没有问题。https://godbolt.org/z/WecT6vP91 https://en.cppreference.com/w/cpp/language/union说 命名空间范围匿名联合必须声明为静态,除非它们出现在未命名的命名空间中。 这似乎是gcc和msvc的错误? 已编

  • 我需要解析和打印ns4:功能部分。空手道以json格式打印它。我试着参考这个答案。但是,我得到'ERROR:'前缀'xsi'的命名空间没有被声明.'错误,如果使用建议的xPath.即, 这是我的XML:它包含许多具有不同“ns”值的部分,但我在这里给出了一个额外的内容。 这是我使用的xPath; 注意:我将上述xml保存在一个单独的文件test1中。xml。我只是在读它并解析它的值。 这就是我得到

  • 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与ECMAScript 2015里的术语保持一致,(也就是说 module X { 相当于现在推荐的写法 namespace X {)。 这篇文章将概括介绍在TypeScript里使用模块与命名空间来组织代码的方法。 我们也会谈及

  • 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与ECMAScript 2015里的术语保持一致,(也就是说 module X { 相当于现在推荐的写法 namespace X {)。 介绍 这篇文章将概括介绍在TypeScript里使用模块与命名空间来组织代码的方法。 我们也