如何在socket.io 1.0中获取会议室的客户列表

uzi*_*ith 35 node.js socket.io socket.io-1.0

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

io.sockets.clients(roomName)
Run Code Online (Sandbox Code Playgroud)

我怎么能在socket.io 1.0中这样做?

Mic*_*ael 36

考虑在上面的评论中链接的更完整的答案:https://stackoverflow.com/a/24425207/1449799


一个房间里的客户可以在

io.nsps[yourNamespace].adapter.rooms[roomName]
Run Code Online (Sandbox Code Playgroud)

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

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

更新(特别是@Zettam):

结帐这个回购看看这个工作:https://github.com/thegreatmichael/socket-io-clients

  • +1提及Object.keys():) (3认同)
  • 这仍然有用吗?我无法让它发挥作用. (2认同)

nha*_*nha 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;
}
Run Code Online (Sandbox Code Playgroud)

如果使用命名空间:

function getClient (ns, id) {
  return io.nsps[ns].adapter.rooms[id]
}
Run Code Online (Sandbox Code Playgroud)

这是我作为一个临时的解决办法使用io.sockets.clients(roomId)成为findClientsSocketByRoomId(roomId).

编辑:

大多数情况下,如果可能的话,应该考虑避免使用这种方法.

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

另外,我还没有使用Redis适配器测试它.

如果必须,如果使用名称空间,也会看到相关问题.


Dep*_*ado 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;
};
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以看到关于该主题的讨论的github pull请求,但是,似乎该功能已从SocketIO的1.0预发布候选版本中删除.


Ton*_*ony 5

截至至少1.4.5 nha的方法也不再起作用,并且仍然没有公共api让客户进入房间.这对我有用.

io.sockets.adapter.rooms[roomId]返回一个具有两个属性,套接字和长度的对象.第一个是另一个对象,它具有用于键的socketId,而boolean作为值:

Room {
   sockets: 
   { '/#vQh0q0gVKgtLGIQGAAAB': true,
     '/#p9Z7l6UeYwhBQkdoAAAD': true },
   length: 2 }
Run Code Online (Sandbox Code Playgroud)

所以我的客户代码看起来像这样:

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