【问题标题】:socket.io rooms or namespacing?socket.io 房间或命名空间?
【发布时间】:2012-06-11 10:01:06
【问题描述】:

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

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

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

资源使用有区别吗?

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    这取决于你想做什么。

    主要区别在于房间更难实施。 您必须在每次重新加载页面时创建加入房间的方法。

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

    使用示例:

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

    【讨论】:

      【解决方案2】:

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

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

      区别

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

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

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

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

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

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

      【讨论】:

      • 在 socket.io 版本 >= 1.0 之后这方面有什么重大变化吗?
      • 上一个版本的变化,阅读socket.io/docs/rooms-and-namespaces,这个答案对于了解房间的事情很有用stackoverflow.com/questions/24041220/…
      • 我们可以说命名空间是我的网络应用程序的某个区域并在该区域中容纳一组客户端吗?
      • 你能在与房间/命名空间断开连接时添加一些内容吗?当客户端暂时断开或失去连接时,他们会发生什么。 Here 是这样写的:在断开连接时,套接字会自动离开它们所属的所有通道,您不需要专门拆除。 通道与你的隔间
      【解决方案3】:

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

      【讨论】:

      • 喜欢!命名空间 - 预定义的连接。房间 - 动态连接
      【解决方案4】:

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

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

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

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

      区别主要在于谁管理他们

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

      【讨论】:

      • 您仍然可以通过授权保护命名空间以防止攻击。
      • 确实@danielrubambura 没有权限的用户无法在前端设置它,尽管它可以由经过身份验证的攻击者创建。假设我创建了一个命名空间,由于某种原因显示为一个公共聊天室,它可以命名为@#$!@#$!然后我们会增加很多必须清理和检查此类名称的复杂性。这只是我能想到的一件事。虽然我提到的情况可能会发生,但我确实知道它不是使用命名空间的内在原因
      • 如果通过查询字符串传递身份验证令牌,也存在中间人攻击。请注意,您需要使用令牌进行两次往返以避免这种情况。
      【解决方案5】:

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

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

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2019-07-20
          • 2017-01-03
          • 2014-01-19
          • 2016-09-04
          • 2015-07-21
          • 2019-01-24
          • 1970-01-01
          • 2012-10-20
          • 2018-06-10
          相关资源
          最近更新 更多