Socket.io 房间还是名称空间?

我正在研究 nodejs/socket.io 实时聊天,我需要一些实现房间的建议。

使用名称空间或使用房间特性来完全隔离各组聊天内容,哪一个更好?

房间和名称空间之间真正的技术区别是什么?

资源使用是否有差异?

67510 次浏览

这取决于你想做什么。

主要区别是 房间更难实现。 你必须制定一个方法来连接每个页面重新加载的房间。

对于 命名空间,您只需要在 Javascript 客户端中编写 var example = io.connect('http://localhost/example');,客户端就会自动添加到名称空间中。

使用范例:

  • 房间: 私人聊天室。
  • 名称空间: 页面的聊天。

这就是名称空间和房间所拥有的 共同点(socket.io v0.9.8-请注意,v1.0涉及到一个完整的重写,所以事情可能已经发生了变化) :

  • 名称空间((’/nsp’))和房间(Join (‘ room’)) 在服务器端创建
  • 多个名称空间和多个房间
  • 服务器将 通过电线只向这些客户发送信息连接到/加入一个 nsp/room,也就是说,它不仅仅是客户端过滤

返回文章页面 分歧:

  • 名称空间通过使用 io.connect(urlAndNsp)的客户机 连接(只有在服务器上已经存在该客户机时,才会将其添加到该名称空间)
  • 房间只能在服务器端 上联接(尽管在服务器端创建一个 API 使客户端能够联接非常简单)
  • 命名空间可以是 授权受保护
  • 对于 room ,授权是不可用的,但是如果用户决定使用 room,可以将自定义授权添加到前面提到的服务器上易于创建的 API 中
  • 房间是名称空间 (默认为‘ global’名称空间)的一部分
  • 命名空间始终根植于全局范围

为了避免将这个概念与名称(房间或名称空间)混淆,我将使用 隔间来引用这个概念,并使用其他两个名称来表示这个概念的 实施。所以如果你

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

后者的一个例子是一个大型客户端应用程序,其中不同的模块,也许是分开开发的(例如第三方) ,每个都使用 socket.io 独立,正在同一个应用程序中使用,并希望共享一个网络连接。

在我看来,如果您只是需要在项目中使用简单的隔间来分离和分组消息,那么没有实际的基准测试,任何一个都可以。

不确定这是否回答了你的问题,但是这个答案的研究至少帮助我看得更清楚了。

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

房间和命名空间对通信进行分段,并对单个套接字进行分组。

向房间或名称空间的广播不会只传递给所有成员。

名称空间和房间之间的区别如下:

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

区别主要在于谁来管理它们

为了决定使用什么,您必须决定分段应该在前端还是在后端管理

名称空间允许您创建具有相同名称的对象,但是它们将是独立的,因为它们将存在于不同的名称空间(也称为作用域)中。

对于 Socket.IO 名称空间,应该有相同的思考过程。如果您正在构建一个模块化的 Node Web 应用程序,那么您将希望将不同的模块命名为命名空间。如果您回头看看我们的名称空间代码,您将看到我们能够在不同的名称空间中侦听相同的事件。在 Socket.IO 中,默认连接上的连接事件和/xxx 名称空间上的连接事件是不同的。例如,如果您的站点上有一个聊天和评论系统,并希望两者都是实时的,那么可以分别使用名称空间。这允许您构建一个完整的 Socket.IO 应用程序,该应用程序只存在于它自己的上下文中。

如果您正在构建要打包和安装的内容,那么这也是正确的。您无法知道是否有人已经在默认名称空间中使用了某些事件,因此应该创建自己的事件并在那里侦听。这使您不必冒犯任何使用您的软件包的开发人员。

名称空间允许我们将连接划分到不同的上下文中。我们可以将其与房间进行比较,后者允许我们将连接分组在一起,然后我们也可以将相同的连接连接到其他房间。

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

名称空间中可以有房间,这有助于组织代码,但是房间中不能有名称空间。因此,名称空间是一个顶级细分和房间是一个较低的水平之一。