我正在研究nodejs / socket.io进行实时聊天,我需要一些建议来实现房间。
哪个更好,使用命名空间或使用房间功能完全隔离聊天对象?
房间和命名空间之间真正的技术差异是什么?
是否存在资源使用差异?
答案 0 :(得分:198)
这就是命名空间和房间共有的共同点(socket.io v0.9.8 - 请注意v1.0涉及完全重写,因此事情可能已经改变):
差异:
io.connect(urlAndNsp)
连接(仅当服务器上已存在客户端时,才会将客户端添加到该命名空间)为了不将概念与名称(房间或命名空间)混淆,我将使用 compartment 来引用该概念,并使用实现的其他两个名称这个概念。所以,如果你
后者的一个示例是一个大型客户端应用程序,其中可能独立使用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使用的不同上下文。房间允许您在这些上下文内对客户端连接进行分组。