socket.io房间或命名空间?


163

我正在研究nodejs / socket.io的实时聊天,并且需要一些有关实施会议室的建议。

使用名称空间或使用房间功能来完全隔离颤抖的对方,哪个更好?

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

资源使用方面有区别吗?

Answers:


216

这是名称空间和房间的共同点(socket.io v0.9.8-请注意,v1.0涉及完整的重写,因此情况可能有所更改):

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

差异

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

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

  • 需要每个隔间的授权,名称空间可能是最简单的方法
  • 如果要分层放置隔层(最多2层),请使用名称空间/房间组合
  • 如果您的客户端应用程序由不同部分组成(它们本身并不关心隔离专区,但是需要彼此分开),请使用名称空间。

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

在我尚未真正进行基准测试的情况下,在我看来,如果您只需要在项目中使用简单的隔离专区来分隔和分组消息,则任何一种都可以。

不确定是否能回答您的问题,但是导致该问题的研究至少帮助我更清楚了。


5
在socket.io版本> = 1.0之后,有什么重大变化吗?
Xeroxoid

2
在最近版本的变化,阅读 socket.io/docs/rooms-and-namespaces和这个答案可以了解房间的东西有用 stackoverflow.com/questions/24041220/...
贡萨洛Bahamondez

1
我们可以说名称空间是我的Web应用程序中的某个区域,并在该区域中容纳一组客户端吗?
Onaiggac

与房间/命名空间断开连接时,能否添加一些有关的信息。当客户端暂时断开连接或断开连接时,它们会发生什么。内容如下断开连接后,套接字会自动离开它们所属的所有通道,并且不需要您进行专门的拆卸。是一个频道与您的车厢
2015年

67

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


3
喜欢它!命名空间-预定义的连接。客房-动态连接
Nandakumar,

16

这取决于您想做什么。

主要区别是房间难以实施。您必须制定一种在每次重新加载页面时加入会议室的方法。

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

使用示例:

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

2

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

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

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

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

区别主要在于谁来管理

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


0

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.