Comment obtenir la liste des clients de room dans socket.io 1,0

je peux avoir la liste des clients de room avec ce code dans socket.io 0.9.

io.sockets.clients(roomName)

Comment puis-je faire cela dans socket.io 1.0?

35
demandé sur Denys Séguret 2014-05-25 22:31:16

5 réponses

considérez cette réponse un peu plus complète liée dans un commentaire ci-dessus sur la question: https://stackoverflow.com/a/24425207/1449799


les clients dans une chambre peut être trouvé à

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

c'est un tableau associatif avec des clés qui sont des ID de socket. Dans notre cas, nous voulions connaître le nombre de clients dans une chambre, donc nous avons fait Object.keys(io.nsps[yourNamespace].adapter.rooms[roomName]).length

dans le cas où vous n'avez pas vu / utilisé des espaces de noms (comme ce type[moi]), vous pouvez en savoir plus sur eux ici http://socket.io/docs/rooms-and-namespaces/ (important: l'espace de nom par défaut est'/')

mise à Jour (esp. pour @Zettam):

vérifiez ce rapport pour voir ce fonctionnement: https://github.com/thegreatmichael/socket-io-clients

36
répondu Michael 2017-05-23 12:09:39

en utilisant @ryan_Hdot link , j'ai créé une petite fonction temporaire dans mon code, qui évite de maintenir un patch. Le voici:

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;
}

si vous utilisez un espace de noms:

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

que j'utilise comme fixation temporaire pour io.sockets.clients(roomId) qui devient findClientsSocketByRoomId(roomId) .

EDIT :

la plupart du temps, il est intéressant d'envisager d'éviter d'utiliser cette méthode si cela est possible.

ce que je fais maintenant est que je mets habituellement un client dans sa propre chambre (c.-à-d. dans une pièce dont le nom est clientID). J'ai trouvé le code plus lisible de cette façon, et je n'ai plus à me fier à cette solution de contournement.

en outre, je n'ai pas testé cela avec un adaptateur Redis.

si vous devez, voir aussi cette question connexe si vous utilisez des espaces de noms.

11
répondu nha 2017-05-23 10:31:09

pour ceux d'entre vous qui utilisent des namespaces, j'ai aussi créé une fonction qui peut gérer différents namespaces. C'est la même chose que la réponse de 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;
};
7
répondu Depado 2014-07-22 15:39:15

, Vous pouvez voir cette github pull request pour le débat sur le sujet, cependant, il semble que cette fonctionnalité a été retirée de la 1.0 pre release candidate pour SocketIO.

5
répondu ryAn_Hdot 2014-05-26 19:13:31

comme d'au moins 1.4.5 la méthode de nha ne fonctionne plus non plus, et il n'y a toujours pas d'api publique pour obtenir des clients dans une salle. Voici ce qui fonctionne pour moi.

io.sockets.adapter.rooms[roomId] renvoie un objet qui possède deux propriétés, sockets, et length. Le premier est un autre objet qui a les socketids pour les clés, et les booléens comme les valeurs:

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

ainsi mon code pour obtenir des clients ressemble à ceci:

var sioRoom = io.sockets.adapter.rooms[roomId];
if( sioRoom ) { 
  Object.keys(sioRoom.sockets).forEach( function(socketId){
    console.log("sioRoom client socket Id: " + socketId );
  }); 
}   
5
répondu Tony 2016-10-05 20:16:28