web-dev-qa-db-fra.com

Prise IO Chambres: Obtenir la liste des clients dans une chambre spécifique

J'essaie d'afficher une liste de clients dans une pièce spécifique. Je veux juste montrer leur nom d'utilisateur, pas leur identifiant de socket.

C'est là où je suis:

socket.set('nickname', "Earl");  
socket.join('chatroom1');
console.log('User joined chat room 1);

var roster = io.sockets.clients('chatroom1');
for ( i in roster )
{
   console.log('Username: ' + roster[i]);   
}

Je n'ai pas eu la chance de pouvoir lister les identifiants de socket ou quoi que ce soit. Voudrait qu'il retourne les surnoms cependant.

15
Taurian

Juste quelques petites choses.

  1. lorsque vous avez le socket, vous pouvez ensuite définir les propriétés telles que: socket.nickname = 'Earl'; pour utiliser ultérieurement la propriété save, par exemple dans un journal de console: console.log(socket.nickname);.

  2. il vous manque une citation de clôture (') dans votre:

    console.log('User joined chat room 1);

  3. Je ne suis pas tout à fait sûr de votre boucle.

Ci-dessous, le code modifié devrait vous aider un peu, mais sachez que la boucle que j'utilise ci-dessous est asynchrone et que cela peut affecter la façon dont vous gérez les transferts de données.

socket.nickname = 'Earl';
socket.join('chatroom1');

console.log('User joined chat room 1');

var roster = io.sockets.clients('chatroom1');

roster.forEach(function(client) {
    console.log('Username: ' + client.nickname);
});

pour vous aider plus, il faudrait que je voie tout votre code car cela ne me donne pas le contexte.

15
Jacob Squires

Pour les personnes utilisant socket.IO versions 1.0 ou supérieures, la réponse ci-dessus risque de ne pas fonctionner. Veuillez vous reporter à la réponse suivante pour le faire . Obtenir la liste de tous les clients dans une pièce spécifique

Code pour mettre à jour l'objet socket pour tous les clients d'une pièce

var clients = io.sockets.adapter.rooms['Room Name'].sockets;   

//to get the number of clients
var numClients = (typeof clients !== 'undefined') ? Object.keys(clients).length : 0;

for (var clientId in clients ) {

     //this is the socket of each client in the room.
     var clientSocket = io.sockets.connected[clientId];

     //you can do whatever you need with this
     clientSocket.emit('new event', "Updates");

}
34
Sony Mathew

Au lieu d'aller au fond de l'objet socket/io, vous pouvez utiliser les méthodes simples et standard suivantes:

io.in(room_name).clients((err , clients) => {
    // clients will be array of socket ids , currently available in given room
});

Pour plus de détails DO READ

6
Vivek Doshi

Toutes les réponses ci-dessus et celle ici socket.io obtiendrez les chambres où se trouve actuellement la prise ou ici Socket.IO - comment puis-je obtenir une liste des prises/clients connectés? étaient incorrects ou incomplets si vous utilisiez la version 2.0.

  1. En 2.0, io.sockets.manager ou io.sockets.clients n'existe plus.
  2. Sans utiliser l'espace de noms, les 3 paramètres suivants peuvent tous obtenir des sockets dans une salle spécifique.

    socket.adapter.rooms;

    io.sockets.adapter.rooms;

    io.sockets.adapter.sids; // le tableau socket.id

  3. Avec namespace (j'ai utilisé "cs" ici), io.sockets.adapter.rooms donnera un résultat assez déroutant et le résultat que socket.adapter.rooms donnera est correct:

    / * socket.adapter.rooms donne: * /

    {"/ cs # v561bgPlss6ELZIZAAAB": {"sockets": {"/ cs # v561bgPlss6ELZIZAAAB": vrai}, "longueur": 1}, "une pièce xxx": {"sockets": {"/ cs # v561bgPlus6ELZZABAB":: true}, "longueur": 1}}

    / * io.sockets.adapter.rooms donne: un sid sans espace de nom * /

    {"v561bgPlss6ELZIZAAAB": {"sockets": {"v561bgPlss6ELZIZAAAB": true}, "longueur": 1}}

Remarque: la pièce par défaut est la suivante: " Chaque socket de Socket.IO est identifié par un identifiant unique, aléatoire et indiscutable. Socket # id. Pour votre commodité, chaque socket rejoint automatiquement une pièce identifiée par cet identifiant ."

Je n'ai essayé que l'adaptateur de mémoire jusqu'à présent, je n'ai pas essayé l'adaptateur Redis.

2
Qiulang

Pour Socket.io supérieur à v1.0 et noeud v6.0 +, utilisez le code suivant:

function getSockets(room) { // will return all sockets with room name
  return Object.entries(io.sockets.adapter.rooms[room] === undefined ?
  {} : io.sockets.adapter.rooms[room].sockets )
    .filter(([id, status]) => status) // get only status = true sockets 
    .map(([id]) => io.sockets.connected[id])
}

Si vous voulez leur envoyer quelque chose, utilisez ceci:

getSockets('room name').forEach(socket => socket.emit('event name', data))
1
Ezzat

Je viens de connecter toutes les prises d'une pièce à la console, vous pouvez faire ce que vous voulez avec elles ...

const socketsInRoom = io.adapter.rooms[room_name];

    /*Collect all participants in room*/
    for(let participant in socketsInRoom){
        for(let socketId in socketsInRoom[participant]){
            console.log(socketId)
        }
    }
0