socket.io房间或命名空间?

时间:2012-06-07 10:48:21

标签: node.js socket.io

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

哪个更好,使用命名空间或使用房间功能完全隔离聊天对象?

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

是否存在资源使用差异?

6 个答案:

答案 0 :(得分:198)

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

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

差异

  • 命名空间由客户端使用io.connect(urlAndNsp)连接(仅当服务器上已存在客户端时,才会将客户端添加到该命名空间)
  • 会议室只能在服务器端加入(尽管在服务器端创建API以使客户端加入很简单)
  • 名称空间可以是authorization protected
  • 授权不适用于会议室,但可以将自定义授权添加到服务器上提及的上述易于创建的API中,以防有人使用会议室
  • 会议室是命名空间的一部分(默认为“全局”命名空间)
  • 名称空间始终以全局范围为根本

为了不将概念与名称(房间或命名空间)混淆,我将使用 compartment 来引用该概念,并使用实现的其他两个名称这个概念。所以,如果你

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

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

实际上没有对此进行基准测试,在我看来,如果您只需要在项目中使用简单的隔离来分隔和分组消息,那么一个就没问题。

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

答案 1 :(得分:54)

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

答案 2 :(得分:12)

这取决于你想做什么。

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

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

利用示例:

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

答案 3 :(得分:1)

房间和名称空间可对通信进行细分,并将各个套接字分组。

广播到房间或名称空间的广播不会仅覆盖成员。

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

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

区别主要在于谁来管理

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

答案 4 :(得分:1)

命名空间内可以有房间,这有助于组织代码,但房间内不能有命名空间。所以命名空间是顶级细分,房间是低级细分。

答案 5 :(得分:0)

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

这与Socket.IO名称空间应具有的思维过程相同。如果要构建模块化的Node Web应用程序,则需要对不同的模块进行命名空间。如果回头看一下我们的名称空间代码,您将看到我们能够在不同的名称空间中监听相同的事件。在Socket.IO中,默认连接上的连接事件和/ xxx名称空间上的连接事件是不同的。例如,如果您的站点上有一个聊天和评论系统,并且希望两者都是实时的,则可以为每个空间命名。这使您可以构建仅在其自身上下文中存在的整个Socket.IO应用程序。

如果您要构建要打包和安装的东西,这也将是正确的。您无法知道某人是否已经在默认名称空间中使用某些事件,因此您应该创建自己的事件并在其中侦听。这样一来,您就不会再踩任何使用您软件包的开发人员的脚步了。

命名空间使我们能够将连接分割成不同的上下文。我们可以将其与房间进行比较,从而可以将连接分组在一起。然后,我们也可以将相同的连接加入其他房间。

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