Answers:
这是名称空间和房间的共同点(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使用的不同上下文。房间允许您在这些上下文内对客户端连接进行分组。