Socket.io 最佳性能-通过环路或房间发射到插座

Socket.io 最佳性能-通过环路或房间发射到插座,socket.io,Socket.io,我们目前有一个聊天应用程序,当向适当的用户发送消息时(可能是1条或多条,取决于对话中的用户数量),我们通过所有套接字(socket.io 2.0.2)连接循环到服务器(NodeJS)根据成员ID值获取用户拥有的套接字列表,因为每个用户可以从多个设备连接。代码如下所示,以确定用户应使用哪些套接字发送消息 var sockets = Object.keys(socketList); var results = []; for (var key in sockets) {

我们目前有一个聊天应用程序,当向适当的用户发送消息时(可能是1条或多条,取决于对话中的用户数量),我们通过所有套接字(socket.io 2.0.2)连接循环到服务器(NodeJS)根据成员ID值获取用户拥有的套接字列表,因为每个用户可以从多个设备连接。代码如下所示,以确定用户应使用哪些套接字发送消息

    var sockets = Object.keys(socketList);
    var results = [];
    for (var key in sockets) {
        if (hasOwnProperty(socketList[sockets[key]].handshake.query, 'token')) {
            if (JSON.parse(socketList[sockets[key]].handshake.query.member).id === memberId) {
                results.push(socketList[sockets[key]]);
            }
        }
    }
必须通过套接字连接进行循环似乎效率低下,我想知道有没有更好的方法。我的想法是为每个用户创建一个房间,大多数用户只有一个连接,但有些用户将通过多个设备连接,因此他们的房间中可以有多个插座。然后,我将只向适当的房间广播,而不是总是通过所有插座循环。考虑到95%的用户只使用一个套接字连接,我不确定这种方法是否更有效,希望您能提供一些信息。 谢谢。

我会用它来完成你想做的事

服务器端,将客户端添加到聊天室:

socket.join('some room');

然后我将使用
socket.to('some room')。发出一条发送者消息,发送给房间中的所有参与者。

首先,socket.io已经为每个用户创建了一个房间。该房间的名称为
socket.id
。房间是非常轻的物体。它们基本上只是由一个对象组成,其中包含房间中所有插座的ID。所以,在使用房间的时候应该毫不犹豫。如果它们适合你正在做的事情,那么就使用它们

至于自己循环和向房间发射,实际上没有什么区别——使用使代码更简单的方法。当您向房间发射时,它所做的只是通过房间中的插座循环并分别发送到每个插座

必须通过套接字连接进行循环似乎效率低下,我想知道有没有更好的方法

房间的主要优点是它们是套接字的预构建关联,因此您不必动态地确定要发送到哪个套接字-在您可以发送到的正确房间中已经有一个套接字列表。因此,只发送到房间中的所有套接字可能比执行代码正在执行的操作更有效率,因为您的代码正在动态地尝试确定要发送到哪个套接字,而不是发送到已经制作好的列表。这会有所不同吗?这取决于整个套接字列表的长度,以及计算出要发送到哪个套接字的成本。我的猜测是,这可能不会有太大的区别

在实际发送部分,向房间发送消息的效率并没有提高多少。每个套接字都必须单独发送消息,以便有人(您的代码或socket.io代码)以任何方式循环访问套接字列表。底层操作系统不包含向多个套接字发送单个消息的功能。每个插座都必须单独发送到

然后,我将只向适当的房间广播,而不是总是通过所有插座循环


发送到房间对您来说是一种编程便利,但是socket.io无论如何都会在封面下循环。

谢谢您的回复。对于socket.io为每个用户创建和维护一个文件室的资源使用情况是否有任何限制?数量不多,大约10000个。如果要从服务器发送到多个socket,同样合理的做法是在套接字id字符串数组上循环,并使用
socket.to('${socketId}').emit('hey','message to a socket's room')发送到它们各自的房间按原样在同一数组上循环,并使用
io.to('${socketId}').emit('hey','message to a socket')发送到各自的套接字?我正在引用,谢谢。@user1063287-从网络的角度来看,手动迭代并发送给每个人,还是让socket.io为您执行,都无关紧要。无论哪种方式,都是相同数量的独立传输。因此,任何性能上的差异都只会出现在每段代码如何迭代一个列表上,而差异可能是微不足道的。仅供参考,您不需要
socket.to('${socketId}').emit(…)
。你可以只做
socket.to(socketId).emit(…)
。当你说
让socket.io为你做这件事时,
,你仍然需要迭代套接字id的数组,不是吗?所以你可以发送到每个基于插座id的房间?(在这种情况下,用户仅在连接时加入的基于默认套接字id的房间中)@user1063287-let socket.io意味着通过
io.emit()
或使用房间管理用户集合,并让socket.io通过
io.to()发送给他们
@jfriend00他的例子会不会慢一点?在您链接到这里的源代码中:它只对消息进行一次编码,而他的语法将对其进行多次编码。我只是想提一下。您确实提到了联网的观点,但在特定场景中,整体广播的效率会稍高一些。