这是一个重复的问题,尽管我想要求它提供更多说明。
我想使用 socket.io 创建私有(private)聊天。在谷歌搜索时,我找到了 2 个解决方案:
- 使用数组存储活跃用户列表
- 使用房间概念
假设我的应用拥有数百万活跃用户。
这就是我想要的:我在 mysql 数据库中有我的 friend 列表,当我登录时,我想要所有 friend 及其状态(活跃或不活跃)。
情况 1。如果我使用数组来存储所有事件用户,那么它效果很好,但是这是将连接到我的应用程序的所有用户存储在数组中的好方法吗?
情况 2. 如果我使用房间概念,其中每个用户 friend 都有一个唯一的 roomid, 那么每当用户登录时,他就必须加入所有这些 roomid。它也对我有用,但在这种情况下,我如何知道我的 friend 是否活跃?
我想知道该解决方案中的哪一个适用于我将拥有数百万用户的应用程序,或者是否有其他方法可以解决此问题。
最佳答案
我会使用第三种解决方案:
- 为每个套接字设置用户
- 每当您需要列出房间中的用户时,请查看房间中的客户端套接字列表
如果您使用的是 socket.IO pre 1.0,那么您可以使用 io.sockets.clients(roomName)
获取房间中的套接字。
对于socket.IO 1.0,目前还不清楚什么是列出连接到房间的套接字的最干净的解决方案:
- https://github.com/Automattic/socket.io/pull/1428
- https://github.com/Automattic/socket.io/issues/1544
现在这里有一个解决方法函数:
function roomSockets(roomId) {
var clients = io.sockets.adapter.rooms[roomId],
sockets = [];
for (var clientId in clients) sockets.push(io.sockets.connected[clientId]);
return sockets;
}
请注意,它可能不适用于所有适配器,因此它充其量只是一种解决方法。
关于node.js - 列出聊天室中的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24059287/