180

我正在调查 nodejs/socket.io 的实时聊天,我需要一些关于实施房间的建议。

哪个更好,使用命名空间或使用房间功能将聊天者完全隔离开来?

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

是否有任何资源使用差异?

4

6 回答 6

239

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

  • 命名空间(io.of('/nsp'))和房间(socket.join('room')都是在服务器端创建的
  • 多个命名空间和多个房间共享同一个 (WebSocket) 连接
  • 服务器将仅通过线路将消息传输到连接到/加入 nsp / 房间的那些客户端,即它不仅仅是客户端过滤

区别:_

  • 命名空间由客户端使用连接io.connect(urlAndNsp)(仅当客户端已经存在于服务器上时,客户端才会被添加到该命名空间)
  • 房间只能在服务器端加入(尽管在服务器端创建 API 以使客户端加入很简单)
  • 命名空间可以受授权保护
  • 房间没有授权,但可以将自定义授权添加到前面提到的服务器上易于创建的 API,以防一心想要使用房间
  • 房间是命名空间的一部分(默认为“全局”命名空间)
  • 命名空间始终植根于全局范围

为了不将概念与名称(房间或命名空间)混淆,我将使用隔间来指代概念,而其他两个名称则用于概念的实现。所以如果你

  • 需要每个隔间的授权,命名空间可能是最简单的途径
  • 如果您想要分层的隔间(最多 2 层),请使用命名空间/房间组合
  • 如果您的客户端应用程序包含不同的部分(它们本身并不关心隔间,但)需要彼此分离,请使用命名空间。

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

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

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

于 2012-08-01T02:56:10.887 回答
77

这是一个古老的问题,但在对该主题进行一些研究后,我发现接受的答案在一个重要点上并不清楚。根据 Guillermo Rauch 本人的说法(见链接):虽然理论上可以在正在运行的应用程序上动态创建命名空间,但您主要将它们用作应用程序的预定义单独部分。另一方面,如果您需要即时创建临时隔间以容纳用户/连接组,则最好使用房间。

于 2013-06-24T13:40:21.890 回答
21

这取决于你想做什么。

主要区别在于房间更难实施。您必须制定一种方法,以便在每次重新加载页面时加入房间。

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

使用示例:

  • 房间:私人聊天。
  • namespaces:页面的聊天。
于 2012-06-07T22:15:17.720 回答
5

房间和命名空间分割通信并将单个套接字分组。

对房间或命名空间的广播不会只到达每个成员。

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

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

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

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

于 2019-07-10T20:11:56.207 回答
2

命名空间允许您创建具有相同名称的对象,但它们将是分开的,因为它们将存在于不同的命名空间中,也称为范围。

这与 Socket.IO 命名空间应该具有的思维过程相同。如果您正在构建一个模块化 Node Web 应用程序,您将需要命名不同的模块。如果您回顾我们的命名空间代码,您会发现我们能够在不同的命名空间中侦听相同的确切事件。在 Socket.IO 中,默认连接上的连接事件和 /xxx 命名空间上的连接事件是不同的。例如,如果您的站点上有一个聊天和评论系统,并且希望两者都是实时的,那么您可以为每个系统命名。这允许您构建一个仅存在于其自身上下文中的整个 Socket.IO 应用程序。

如果您正在构建要打包和安装的东西,这也是正确的。您无法知道是否有人已经在使用默认命名空间中的某些事件,因此您应该创建自己的并在那里收听。这使您不会踩到任何使用您的包的开发人员的脚趾。

命名空间允许我们将连接划分为不同的上下文。我们可以将此与房间进行比较,它允许我们将连接分组在一起。然后我们也可以将相同的连接加入其他房间。

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

于 2019-08-03T12:34:09.980 回答
2

命名空间内可以有房间,这有助于组织代码,但房间内不能有命名空间。所以命名空间是一个顶级分割,房间是一个较低级别的分割。

于 2021-02-11T10:14:09.127 回答