web-dev-qa-db-fra.com

Comment obtenir la liste des clients de la salle dans socket.io 1.0

Je peux obtenir 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
uzimith

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


Les clients dans une chambre peuvent être trouvés à

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

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

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

Mise à jour (en particulier pour @Zettam):

consultez ce repo pour voir cela fonctionne: https://github.com/thegreatmichael/socket-io-clients

36
Michael

En utilisant @ ryan_Hdot link , j'ai créé une petite fonction temporaire dans mon code, ce qui évite de maintenir un patch. C'est ici :

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 correctif temporaire pour io.sockets.clients(roomId) qui devient findClientsSocketByRoomId(roomId).

MODIFIER:

La plupart du temps, il vaut la peine d’éviter d’utiliser cette méthode si possible.

Ce que je fais maintenant, c'est que je place habituellement un client dans sa propre chambre (c'est-à-dire dans une pièce dont le nom est son ID client). J'ai trouvé le code plus lisible de cette façon, et je n'ai plus à compter sur cette solution de contournement.

De plus, je n'ai pas testé cela avec un adaptateur Redis.

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

11
nha

Pour ceux d'entre vous qui utilisent des espaces de noms, j'ai également créé une fonction qui peut gérer différents espaces de noms. C'est tout à fait 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
Depado

Vous pouvez voir cette demande d'extraction github pour une discussion sur le sujet, cependant, il semble que cette fonctionnalité ait été supprimée de la version préliminaire 1.0 de SocketIO.

5
ryAn_Hdot

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

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

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

Donc, 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
Tony