35

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

io.sockets.clients(roomName)

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

4

5 回答 5

36

考虑在上面关于问题的评论中链接的这个更完整的答案:https ://stackoverflow.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

于 2014-07-17T18:47:52.610 回答
11

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

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 适配器对此进行测试。

如果必须,如果您使用命名空间,还请参阅此相关问题。

于 2014-06-04T10:24:06.373 回答
7

对于那些使用命名空间的人,我也制作了一个可以处理不同命名空间的函数。这与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;
};
于 2014-07-22T15:39:15.147 回答
6

至少从 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 );
  }); 
}   
于 2016-10-05T20:16:28.170 回答
5

您可以看到这个 github 拉取请求以讨论该主题,但是,似乎该功能已从 SocketIO 的 1.0 预发布候选版本中剥离。

于 2014-05-26T19:13:31.667 回答