我正在调查 nodejs/socket.io 的实时聊天,我需要一些关于实施房间的建议。
哪个更好,使用命名空间或使用房间功能将聊天者完全隔离开来?
房间和命名空间之间真正的技术区别是什么?
是否有任何资源使用差异?
这是命名空间和房间的共同点(socket.io v0.9.8 - 请注意 v1.0 涉及完全重写,所以事情可能已经改变):
区别:_
io.connect(urlAndNsp)
(仅当客户端已经存在于服务器上时,客户端才会被添加到该命名空间)为了不将概念与名称(房间或命名空间)混淆,我将使用隔间来指代概念,而其他两个名称则用于概念的实现。所以如果你
后者的一个例子是一个大型客户端应用程序,其中不同的模块,可能是单独开发的(例如第三方),每个单独使用 socket.io,正在同一个应用程序中使用,并希望共享一个网络连接。
实际上并没有对此进行基准测试,在我看来,如果您只需要在项目中使用简单的隔间来分隔和分组消息,那么任何一个都可以。
不确定这是否回答了你的问题,但导致这个答案的研究至少让我看得更清楚。
这是一个古老的问题,但在对该主题进行一些研究后,我发现接受的答案在一个重要点上并不清楚。根据 Guillermo Rauch 本人的说法(见链接):虽然理论上可以在正在运行的应用程序上动态创建命名空间,但您主要将它们用作应用程序的预定义单独部分。另一方面,如果您需要即时创建临时隔间以容纳用户/连接组,则最好使用房间。
这取决于你想做什么。
主要区别在于房间更难实施。您必须制定一种方法,以便在每次重新加载页面时加入房间。
使用命名空间,您只需要 var example = io.connect('http://localhost/example');
在javascript 客户端中编写,客户端就会自动添加到命名空间中。
使用示例:
房间和命名空间分割通信并将单个套接字分组。
对房间或命名空间的广播不会只到达每个成员。
命名空间和房间之间的区别如下:
区别主要在于谁来管理它们
要决定使用什么,您必须决定是在前端还是在后端管理分段
命名空间允许您创建具有相同名称的对象,但它们将是分开的,因为它们将存在于不同的命名空间中,也称为范围。
这与 Socket.IO 命名空间应该具有的思维过程相同。如果您正在构建一个模块化 Node Web 应用程序,您将需要命名不同的模块。如果您回顾我们的命名空间代码,您会发现我们能够在不同的命名空间中侦听相同的确切事件。在 Socket.IO 中,默认连接上的连接事件和 /xxx 命名空间上的连接事件是不同的。例如,如果您的站点上有一个聊天和评论系统,并且希望两者都是实时的,那么您可以为每个系统命名。这允许您构建一个仅存在于其自身上下文中的整个 Socket.IO 应用程序。
如果您正在构建要打包和安装的东西,这也是正确的。您无法知道是否有人已经在使用默认命名空间中的某些事件,因此您应该创建自己的并在那里收听。这使您不会踩到任何使用您的包的开发人员的脚趾。
命名空间允许我们将连接划分为不同的上下文。我们可以将此与房间进行比较,它允许我们将连接分组在一起。然后我们也可以将相同的连接加入其他房间。
命名空间允许您为 Socket.IO 创建不同的上下文来工作。房间允许您在这些上下文中对客户端连接进行分组。
命名空间内可以有房间,这有助于组织代码,但房间内不能有命名空间。所以命名空间是一个顶级分割,房间是一个较低级别的分割。