【问题标题】:List the users in a chat room列出聊天室中的用户
【发布时间】:2014-07-26 09:26:12
【问题描述】:

这是一个重复的问题,但我想请它进一步澄清。
我想使用 socket.io 创建一个私人聊天。在谷歌搜索时,我找到了 2 个解决方案:

  1. 使用数组存储活动用户列表
  2. 使用房间概念

假设我的应用拥有数百万活跃用户。
这就是我想要的:我在 mysql db 中有我的朋友列表,当我登录时,我想要所有朋友及其状态(活跃与否)。

案例 1. 如果我使用一个数组来存储所有活跃用户,那么它工作得很好,但这是将所有连接到我的应用的用户存储在一个数组中的好方法吗?

案例 2. 如果我使用每个用户朋友都有一个唯一的 roomid 的房间概念, 然后每当用户登录时,他必须加入所有这些房间。它也对我有用,但在这种情况下,我怎么知道我的朋友是否活跃?

我想知道哪种解决方案适用于我的拥有数百万用户的应用,或者有没有其他方法可以解决这个问题。

【问题讨论】:

  • 您能否详细说明您正在使用的 socket.IO 版本以及您打算使用多个节点还是只使用一个节点?
  • 我使用的是 socket.io 的 0.9.16 版本

标签: node.js sockets socket.io nodes nodejitsu


【解决方案1】:

我会使用第三种解决方案:

  • 将用户设置到每个套接字
  • 在您需要列出房间中的用户时,随时查看房间中的客户端套接字列表

如果您使用的是 socket.IO pre 1.0,那么您可以使用io.sockets.clients(roomName) 来获取房间中的套接字。

对于 socket.IO 1.0,目前还不清楚列出连接到房间的套接字的最干净的解决方案是什么:

现在这里有一个解决方法:

function roomSockets(roomId) {
    var clients = io.sockets.adapter.rooms[roomId],
        sockets = [];
    for (var clientId in clients) sockets.push(io.sockets.connected[clientId]);
    return sockets;
}

请注意,它可能不适用于所有适配器,因此充其量只是一种解决方法。

【讨论】:

  • 我使用了 var clients = io.sockets.clients('room1');控制台输出:[object Object] 如何打印所有客户端列表
  • 使用io.sockets.clients('room1').forEach(function(s){ console.log(s) });
  • 是的,我以同样的方式做,输出是 [object Object] 如何解析对象,我想要来自这个数组的数据
  • 一个解决方案是使用set和get。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多