如何在 socket.io 1.0 中获取房间的客户列表

Posted

技术标签:

【中文标题】如何在 socket.io 1.0 中获取房间的客户列表【英文标题】:How to get room's clients list in socket.io 1.0 【发布时间】:2014-07-14 13:08:08 【问题描述】:

我可以在 socket.io 0.9 中使用此代码获取房间的客户列表。

io.sockets.clients(roomName)

如何在 socket.io 1.0 中做到这一点?

【问题讨论】:

查看***.com/questions/6563885/… 还有这个:***.com/questions/9352549/… 【参考方案1】:

请考虑在上述问题的评论中链接的这个更完整的答案:https://***.com/a/24425207/1449799


房间里的客户可以在

找到
io.nsps[yourNamespace].adapter.rooms[roomName]

这是一个关联数组,其中的键是套接字 ID。在我们的例子中,我们想知道一个房间里的客户数量,所以我们做了Object.keys(io.nsps[yourNamespace].adapter.rooms[roomName]).length

如果你还没有看到/使用过命名空间(比如这个家伙[我]),你可以在这里了解它们http://socket.io/docs/rooms-and-namespaces/(重要的是:默认命名空间是'/')

更新(尤其是@Zettam):

签出这个 repo 看看这个工作:https://github.com/thegreatmichael/socket-io-clients

【讨论】:

我是“这家伙”吗? ^^ 另外,默认命名空间是“/”或“”。 @nha 抱歉,不,我是“这家伙” @Michael 我明白了 :) 老实说,我也可能是我,我从未真正使用过命名空间(测试除外)。 @Zettam 是的。我用 github 中一个示例的链接更新了答案。看看那个是否适合你。【参考方案2】:

至少从 1.4.5 开始,nha 的方法也不再有效,并且仍然没有用于让客户进入房间的公共 api。这对我有用。

io.sockets.adapter.rooms[roomId] 返回一个具有两个属性、套接字和长度的对象。第一个是另一个对象,其键为 socketId,值为布尔值:

Room 
   sockets: 
    '/#vQh0q0gVKgtLGIQGAAAB': true,
     '/#p9Z7l6UeYwhBQkdoAAAD': true ,
   length: 2 

所以我获取客户的代码如下所示:

var sioRoom = io.sockets.adapter.rooms[roomId];
if( sioRoom )  
  Object.keys(sioRoom.sockets).forEach( function(socketId)
    console.log("sioRoom client socket Id: " + socketId );
  ); 
   

【讨论】:

感谢您分享您的技巧。您的答案现在是最新的 socket.io 的真正答案。【参考方案3】:

使用@ryan_Hdot link,我在我的代码中创建了一个小的临时函数,从而避免了维护补丁。这里是:

function getClient(roomId) 
  var res = [],
      room = io.sockets.adapter.rooms[roomId];
  if (room) 
    for (var id in room) 
      res.push(io.sockets.adapter.nsp.connected[id]);
    
  
  return res;

如果使用命名空间:

function getClient (ns, id) 
  return io.nsps[ns].adapter.rooms[id]

我将它用作io.sockets.clients(roomId) 的临时修复,它变成了findClientsSocketByRoomId(roomId)

编辑:

在大多数情况下,如果可能的话,值得考虑避免使用这种方法。

我现在所做的是,我通常将客户放在它自己的房间中(即在一个名称为 clientID 的房间中)。我发现这样的代码更具可读性,我不必再依赖这种解决方法了。

另外,我还没有使用 Redis 适配器对此进行测试。

如果需要,如果您正在使用命名空间,还请参阅 this related question。

【讨论】:

【参考方案4】:

对于那些使用命名空间的人,我也制作了一个可以处理不同命名空间的函数。这与nha的答案完全相同。

function get_users_by_room(nsp, room) 
  var users = []
  for (var id in io.of(nsp).adapter.rooms[room]) 
    users.push(io.of(nsp).adapter.nsp.connected[id]);
  ;
  return users;
;

【讨论】:

【参考方案5】:

您可以查看this github pull request 以讨论该主题,但是,似乎该功能已从 SocketIO 的 1.0 预发布候选版本中剥离。

【讨论】:

以上是关于如何在 socket.io 1.0 中获取房间的客户列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 socket.io 时如何获取房间内的客户端数量?

在Socket.IO 1.0中将消息发送到特定ID

如何在socket.io nodejs服务器上列出房间

如何在socket.io中发射到房间? [复制]

Socket IO Rooms:获取特定房间的客户端列表

如何使用集群处理 Socket.IO 房间?