NodeJS socket.io 房间或命名空间?

cgfeq70w  于 2023-06-05  发布在  Node.js
关注(0)|答案(7)|浏览(260)

我正在调查nodejs/socket.io的真实的聊天,我需要一些关于实现房间的建议。
使用namespace或使用room特性来完全隔离聊天者的群体,哪一个更好?
Rooms和Namespace之间真实的的技术区别是什么?
是否存在资源使用差异?

z5btuh9x

z5btuh9x1#

这就是命名空间和房间的共同点(socket.io v0.9.8 -请注意v1.0涉及完全重写,所以事情可能已经改变):

  • 命名空间(io.of('/nsp'))和房间(socket.join('room')都是在服务器端创建的
  • 多个命名空间和多个房间共享同一个(WebSocket)连接
  • 服务器将通过线路只向那些连接到/加入了nsp /房间的客户端发送消息,即不仅仅是客户端过滤
    差异
    *客户端使用io.connect(urlAndNsp)连接到命名空间(只有在服务器上已经存在该命名空间时,客户端才会被添加到该命名空间)
    *房间只能在服务器端加入(虽然在服务器端创建API让客户端加入很简单)
    *命名空间可以是authorization protected
    *房间不支持授权,但如果你想使用房间,可以在服务器上的上述易于创建的API中添加自定义授权
    *房间是命名空间的一部分(默认为'global'命名空间)
    *命名空间始终以全局作用域为根

为了避免概念与名称(房间或名称空间)混淆,我将使用 compartment 来引用概念,而另外两个名称则用于概念的 implementations。所以如果你

  • 需要 * 每隔室授权 *,名称空间可能是最简单的方法
  • 如果你想要 * 分层的隔间 *(最多2层),使用命名空间/房间组合
  • 如果您的客户端应用程序由不同的部分组成,这些部分(本身并不关心隔间,但)需要彼此分离,请使用名称空间。

后者的一个示例是大型客户端应用程序,其中可能单独开发的不同模块(例如,第三方),各自独立地使用socket.io,正在同一应用中使用并且想要共享单个网络连接。
由于没有实际的基准测试,在我看来,如果你只是需要在你的项目中简单的隔间来分隔和分组消息,任何一个都可以。
不确定这是否回答了你的问题,但导致这个答案的研究至少帮助我看得更清楚。

xcitsw88

xcitsw882#

这是一个老问题,但在对这个主题做了一些研究后,我发现公认的答案在一个重要的问题上并不明确。吉列尔莫·劳赫(Guillermo Rauch)自己说:尽管理论上可以在运行的应用程序上动态地创建名称空间,但您主要将它们用作应用程序的预定义的单独部分。另一方面,如果您需要创建临时隔间来容纳用户/连接组,那么最好使用房间。

u4vypkhs

u4vypkhs3#

这取决于你想做什么。
主要区别是房间更难实现。您必须制定一种方法,以便在每次重新加载页面时加入房间。
有了namespaces,你只需要在你的 *javascript客户端 * 中写var example = io.connect('http://localhost/example');,客户端就会自动添加到namespaces中。
使用示例:

  • 房间:私人聊天。
  • namespaces:页面的聊天。
mec1mxoz

mec1mxoz4#

房间和命名空间将通信分段并将各个套接字分组。
对房间或名称空间的广播不会到达每个人,而只是到达成员。
命名空间和房间之间的区别如下:

  • 命名空间:在前端管理,这意味着用户或攻击者通过前端加入,并且在这里管理加入和断开连接。
  • 房间:在后台管理,这意味着服务器分配加入和离开房间。

区别主要在于谁来管理它们
要决定使用什么,您必须决定是否应该在前端或后端管理分段

qgzx9mmu

qgzx9mmu5#

命名空间允许您创建具有相同名称的对象,但它们将是独立的,因为它们将位于不同的命名空间中,也称为范围。
这与处理Socket.IO名称空间时的思维过程相同。如果你正在构建一个模块化的Node Web应用程序,你将需要命名不同的模块。如果您回顾一下我们的名称空间代码,您将看到我们能够在不同的名称空间中侦听相同的事件。在Socket.IO中,默认连接上的连接事件和/xxx命名空间上的连接事件是不同的。例如,如果您的网站上有一个聊天和评论系统,并且希望两者都是真实的的,那么您可以为每个系统命名。这允许您构建一个只存在于自己的上下文中的完整Socket.IO应用程序。
如果您正在构建要打包和安装的东西,这也是正确的。您无法知道是否有人已经在使用默认名称空间中的某些事件,因此您应该创建自己的名称空间并在那里侦听。这允许您不踩任何使用您的包的开发人员的脚趾。
名称空间允许我们将连接划分到不同的上下文中。我们可以将其与房间进行比较,这允许我们将连接分组在一起。然后,我们也可以让相同的连接加入其他房间。

命名空间允许您为Socket.IO创建不同的上下文。房间允许您在这些上下文内对客户端连接进行分组。

enyaitl3

enyaitl36#

名称空间中可以有房间,这有助于组织代码,但房间中不能有名称空间。所以namespace是一个顶级的细分,而rooms是一个低级的细分。

zpqajqem

zpqajqem7#

TL/DR

www.example.com中的命名空间和房间Socket.io非常相似,最大的区别是:

  • 命名空间中有房间
  • 命名空间在服务器端创建从客户端加入
  • 房间纯粹是服务器端的,客户端不知道它们

你选择使用哪一个纯粹是基于你试图构建的东西。
这里有一些更多的细节,从this有用的帖子。

命名空间

IO允许你命名你的套接字,这实质上意味着分配不同的端点或路径。
这是一个有用的功能,可以最小化资源数量(TCP连接),同时引入通信信道之间的分离。

**命名空间在服务器端创建。但是它们是由客户端通过向服务器发送请求来加入的。io.connect('/namespace')

房间

**房间是命名空间的子通道。**房间纯粹是服务器端的构造,客户端对它们一无所知。
**你不能从客户端使用套接字io加入房间,它应该发生在服务器端。**为了解决这个问题,你需要发出一个套接字,其中包含你想要加入的房间作为数据,在服务器端监听这个套接字,并使用已发送的房间的名称或id调用socket.join()。

相关问题