我正在调查nodejs/socket.io的真实的聊天,我需要一些关于实现房间的建议。使用namespace或使用room特性来完全隔离聊天者的群体,哪一个更好?Rooms和Namespace之间真实的的技术区别是什么?是否存在资源使用差异?
z5btuh9x1#
这就是命名空间和房间的共同点(socket.io v0.9.8 -请注意v1.0涉及完全重写,所以事情可能已经改变):
io.connect(urlAndNsp)
为了避免概念与名称(房间或名称空间)混淆,我将使用 compartment 来引用概念,而另外两个名称则用于概念的 implementations。所以如果你
后者的一个示例是大型客户端应用程序,其中可能单独开发的不同模块(例如,第三方),各自独立地使用socket.io,正在同一应用中使用并且想要共享单个网络连接。由于没有实际的基准测试,在我看来,如果你只是需要在你的项目中简单的隔间来分隔和分组消息,任何一个都可以。不确定这是否回答了你的问题,但导致这个答案的研究至少帮助我看得更清楚。
xcitsw882#
这是一个老问题,但在对这个主题做了一些研究后,我发现公认的答案在一个重要的问题上并不明确。吉列尔莫·劳赫(Guillermo Rauch)自己说:尽管理论上可以在运行的应用程序上动态地创建名称空间,但您主要将它们用作应用程序的预定义的单独部分。另一方面,如果您需要创建临时隔间来容纳用户/连接组,那么最好使用房间。
u4vypkhs3#
这取决于你想做什么。主要区别是房间更难实现。您必须制定一种方法,以便在每次重新加载页面时加入房间。有了namespaces,你只需要在你的 *javascript客户端 * 中写var example = io.connect('http://localhost/example');,客户端就会自动添加到namespaces中。使用示例:
var example = io.connect('http://localhost/example');
mec1mxoz4#
房间和命名空间将通信分段并将各个套接字分组。对房间或名称空间的广播不会到达每个人,而只是到达成员。命名空间和房间之间的区别如下:
区别主要在于谁来管理它们要决定使用什么,您必须决定是否应该在前端或后端管理分段
qgzx9mmu5#
命名空间允许您创建具有相同名称的对象,但它们将是独立的,因为它们将位于不同的命名空间中,也称为范围。这与处理Socket.IO名称空间时的思维过程相同。如果你正在构建一个模块化的Node Web应用程序,你将需要命名不同的模块。如果您回顾一下我们的名称空间代码,您将看到我们能够在不同的名称空间中侦听相同的事件。在Socket.IO中,默认连接上的连接事件和/xxx命名空间上的连接事件是不同的。例如,如果您的网站上有一个聊天和评论系统,并且希望两者都是真实的的,那么您可以为每个系统命名。这允许您构建一个只存在于自己的上下文中的完整Socket.IO应用程序。如果您正在构建要打包和安装的东西,这也是正确的。您无法知道是否有人已经在使用默认名称空间中的某些事件,因此您应该创建自己的名称空间并在那里侦听。这允许您不踩任何使用您的包的开发人员的脚趾。名称空间允许我们将连接划分到不同的上下文中。我们可以将其与房间进行比较,这允许我们将连接分组在一起。然后,我们也可以让相同的连接加入其他房间。
命名空间允许您为Socket.IO创建不同的上下文。房间允许您在这些上下文内对客户端连接进行分组。
enyaitl36#
名称空间中可以有房间,这有助于组织代码,但房间中不能有名称空间。所以namespace是一个顶级的细分,而rooms是一个低级的细分。
zpqajqem7#
www.example.com中的命名空间和房间Socket.io非常相似,最大的区别是:
你选择使用哪一个纯粹是基于你试图构建的东西。这里有一些更多的细节,从this有用的帖子。
IO允许你命名你的套接字,这实质上意味着分配不同的端点或路径。这是一个有用的功能,可以最小化资源数量(TCP连接),同时引入通信信道之间的分离。
**命名空间在服务器端创建。但是它们是由客户端通过向服务器发送请求来加入的。io.connect('/namespace'))
io.connect('/namespace')
**房间是命名空间的子通道。**房间纯粹是服务器端的构造,客户端对它们一无所知。**你不能从客户端使用套接字io加入房间,它应该发生在服务器端。**为了解决这个问题,你需要发出一个套接字,其中包含你想要加入的房间作为数据,在服务器端监听这个套接字,并使用已发送的房间的名称或id调用socket.join()。
7条答案
按热度按时间z5btuh9x1#
这就是命名空间和房间的共同点(socket.io v0.9.8 -请注意v1.0涉及完全重写,所以事情可能已经改变):
差异:
*客户端使用
io.connect(urlAndNsp)
连接到命名空间(只有在服务器上已经存在该命名空间时,客户端才会被添加到该命名空间)*房间只能在服务器端加入(虽然在服务器端创建API让客户端加入很简单)
*命名空间可以是authorization protected
*房间不支持授权,但如果你想使用房间,可以在服务器上的上述易于创建的API中添加自定义授权
*房间是命名空间的一部分(默认为'global'命名空间)
*命名空间始终以全局作用域为根
为了避免概念与名称(房间或名称空间)混淆,我将使用 compartment 来引用概念,而另外两个名称则用于概念的 implementations。所以如果你
后者的一个示例是大型客户端应用程序,其中可能单独开发的不同模块(例如,第三方),各自独立地使用socket.io,正在同一应用中使用并且想要共享单个网络连接。
由于没有实际的基准测试,在我看来,如果你只是需要在你的项目中简单的隔间来分隔和分组消息,任何一个都可以。
不确定这是否回答了你的问题,但导致这个答案的研究至少帮助我看得更清楚。
xcitsw882#
这是一个老问题,但在对这个主题做了一些研究后,我发现公认的答案在一个重要的问题上并不明确。吉列尔莫·劳赫(Guillermo Rauch)自己说:尽管理论上可以在运行的应用程序上动态地创建名称空间,但您主要将它们用作应用程序的预定义的单独部分。另一方面,如果您需要创建临时隔间来容纳用户/连接组,那么最好使用房间。
u4vypkhs3#
这取决于你想做什么。
主要区别是房间更难实现。您必须制定一种方法,以便在每次重新加载页面时加入房间。
有了namespaces,你只需要在你的 *javascript客户端 * 中写
var example = io.connect('http://localhost/example');
,客户端就会自动添加到namespaces中。使用示例:
mec1mxoz4#
房间和命名空间将通信分段并将各个套接字分组。
对房间或名称空间的广播不会到达每个人,而只是到达成员。
命名空间和房间之间的区别如下:
区别主要在于谁来管理它们
要决定使用什么,您必须决定是否应该在前端或后端管理分段
qgzx9mmu5#
命名空间允许您创建具有相同名称的对象,但它们将是独立的,因为它们将位于不同的命名空间中,也称为范围。
这与处理Socket.IO名称空间时的思维过程相同。如果你正在构建一个模块化的Node Web应用程序,你将需要命名不同的模块。如果您回顾一下我们的名称空间代码,您将看到我们能够在不同的名称空间中侦听相同的事件。在Socket.IO中,默认连接上的连接事件和/xxx命名空间上的连接事件是不同的。例如,如果您的网站上有一个聊天和评论系统,并且希望两者都是真实的的,那么您可以为每个系统命名。这允许您构建一个只存在于自己的上下文中的完整Socket.IO应用程序。
如果您正在构建要打包和安装的东西,这也是正确的。您无法知道是否有人已经在使用默认名称空间中的某些事件,因此您应该创建自己的名称空间并在那里侦听。这允许您不踩任何使用您的包的开发人员的脚趾。
名称空间允许我们将连接划分到不同的上下文中。我们可以将其与房间进行比较,这允许我们将连接分组在一起。然后,我们也可以让相同的连接加入其他房间。
命名空间允许您为Socket.IO创建不同的上下文。房间允许您在这些上下文内对客户端连接进行分组。
enyaitl36#
名称空间中可以有房间,这有助于组织代码,但房间中不能有名称空间。所以namespace是一个顶级的细分,而rooms是一个低级的细分。
zpqajqem7#
TL/DR
www.example.com中的命名空间和房间Socket.io非常相似,最大的区别是:
你选择使用哪一个纯粹是基于你试图构建的东西。
这里有一些更多的细节,从this有用的帖子。
命名空间
IO允许你命名你的套接字,这实质上意味着分配不同的端点或路径。
这是一个有用的功能,可以最小化资源数量(TCP连接),同时引入通信信道之间的分离。
**命名空间在服务器端创建。但是它们是由客户端通过向服务器发送请求来加入的。
io.connect('/namespace')
)房间
**房间是命名空间的子通道。**房间纯粹是服务器端的构造,客户端对它们一无所知。
**你不能从客户端使用套接字io加入房间,它应该发生在服务器端。**为了解决这个问题,你需要发出一个套接字,其中包含你想要加入的房间作为数据,在服务器端监听这个套接字,并使用已发送的房间的名称或id调用socket.join()。