我正在研究实时聊天的nodejs/socket.io,并需要一些实现房间的建议。
使用命名空间还是使用房间特性将聊天者完全隔离开来更好?
房间和命名空间之间的真正技术差别是什么?
是否有任何资源使用差异?
io.connect(urlAndNsp)
连接命名空间(如果服务器上已经存在该命名空间,则客户端将仅添加到该命名空间)为了不混淆概念和名称(房间或命名空间),我将使用compartment来指代概念,而另外两个名称则用于概念的实现。所以如果您
后一种情况的一个例子是一个大型客户端应用程序,其中不同的模块,也许是单独开发的(例如第三方),每个模块都独立地使用socket.io,并在同一个应用程序中使用并共享一个网络连接。
没有实际基准测试,但在我看来,如果您只需要在项目中简单地隔离和分组消息,则两种方法都可以。
不确定是否回答了您的问题,但导致这个答案的研究至少帮助我更清楚地看到了问题。
这是一个老问题,但在对该主题进行一些研究后,我发现被接受的答案在一个重要点上不够清晰。根据Guillermo Rauch本人的说法(请参见链接):虽然在运行中创建命名空间是理论上可能的,但您主要将它们用作应用程序中预定义的单独部分。另一方面,如果您需要创建临时区段以容纳用户/连接组,则最好使用房间。
这取决于你想做什么。
主要区别在于房间更难实现。 您必须编写一个方法来加入房间,并在每次页面重新加载时执行。
使用命名空间,您只需要在javascript客户端中编写var example = io.connect('http://localhost/example');
,客户端会自动添加到命名空间中。
使用示例:
房间和命名空间可以分组单独的套接字进行通讯。
向房间或命名空间广播不会将消息发送给所有人,而是只发送给成员。
命名空间和房间之间的区别如下:
主要区别在于谁管理它们。
为了决定使用哪种方式,您必须决定分割应该在前端还是后端进行管理。
命名空间可以包含房间,这有助于组织代码,但是不能在房间内包含命名空间。 因此,命名空间是顶级分段,而房间是较低级别的分段。
Socket.io 中的命名空间和房间非常相似,最大的区别是:
根据您正在构建的内容选择使用哪一个。
这里有更多细节,请参考this这篇有用的文章。
io.connect('/namespace')
)命名空间 | 房间 |
---|---|
公共 | 私有 |
面向客户端 | 面向服务器端 |
命名空间可以包含房间 | 房间不能包含命名空间 |
最佳用例:在代码中预定义 | 最佳用例:动态创建 |