it-swarm.com.de

Steckdose IO Räume: Liste der Kunden in einem bestimmten Raum abrufen

Ich versuche, eine Liste von Kunden in einem bestimmten Raum anzuzeigen. Ich möchte nur ihren Benutzernamen und nicht ihre Socket-ID anzeigen.

Hier, wo ich bin:

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

Hatte kein Glück, Socket-IDs oder etwas anderes aufzulisten. Möchte es aber die Spitznamen zurückgeben.

15
Taurian

Nur ein paar Dinge.

  1. wenn Sie socket haben, können Sie die Eigenschaften später wie folgt festlegen: socket.nickname = 'Earl';, um die save-Eigenschaft beispielsweise in einem Konsolenprotokoll zu verwenden: console.log(socket.nickname);

  2. ihnen fehlt ein Schlusszitat (') in Ihrem:

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

  3. Ich bin nicht ganz sicher über Ihre Schleife.

Unten ist der geänderte Code, der Ihnen ein bisschen helfen soll. Beachten Sie auch, dass die Schleife, die ich unten benutze, asynchron ist und dies Auswirkungen darauf haben kann, wie Sie mit Datenübertragungen umgehen.

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

um Ihnen mehr zu helfen, müsste ich Ihren gesamten Code sehen, da dies mir keinen Kontext gibt.

15
Jacob Squires

Für Benutzer von socket.IO Version 1.0 oder höher funktioniert die obige Antwort möglicherweise nicht. Bitte beachten Sie dazu die folgende Antwort . Liste aller Kunden in einem bestimmten Raum abrufen

Code zum Aktualisieren des Socket-Objekts für alle Clients in einem Raum

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

Anstatt tief in socket/io-Objekt zu gehen, können Sie den einfachen und standardmäßigen Weg verwenden:

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

Für mehr Details DO READ

6
Vivek Doshi

Alle Antworten oben und die hier socket.io bekommen Räume welche Buchse sich aktuell in oder hier Socket.IO befindet - wie bekomme ich eine Liste der angeschlossenen Sockets/Clients? waren falsch oder unvollständig, wenn Sie 2.0 verwenden.

  1. In 2.0 existiert io.sockets.manager oder io.sockets.clients nicht mehr.
  2. Wenn Sie keinen Namespace verwenden, können die folgenden 3 Parameter alle Sockets in einem bestimmten Raum erhalten.

    sockel.adapterzimmer.

    io.sockets.adapter.rooms;

    io.sockets.adapter.sids; // das Socket.id-Array

  3. Mit Namespace (ich habe hier "cs" verwendet), ergibt io.sockets.adapter.rooms ein ziemlich verwirrendes Ergebnis und das Ergebnis socket.adapter.rooms ergibt:

    / * socket.adapter.rooms geben: * /

    {"/ cs # v561bgPlss6ELZIZAAAB": {"sockets": {"/ cs # v561bgPlss6ELZIZAAAB": true}, "length": 1}, "ein Raum xxx": {"sockets": {"/ cs # v561bgSss6ELZIZAAAB": wahr}, "length": 1}}

    / * io.sockets.adapter.rooms gibt Folgendes aus: eine Sid ohne Namensraum * /

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

Hinweis: Der Standardraum lautet wie folgt: " Jeder Sockel in Socket.IO wird durch eine zufällige, nicht zu erachtende eindeutige Kennung identifiziert. Socket # id. Jeder Sockel schließt sich automatisch einem Raum an, der durch diese ID identifiziert wird."

Ich habe bisher nur Speicheradapter ausprobiert, habe Redis-Adapter nicht ausprobiert.

2
Qiulang

Für Socket.io größer als v1.0 und Knoten v6.0 + verwenden Sie den folgenden Code:

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])
}

Wenn Sie etwas an sie senden möchten, verwenden Sie Folgendes:

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

Ich habe gerade alle Sockets in einem Raum an der Konsole angemeldet, Sie können mit ihnen alles machen, was Sie möchten ...

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

socket.io ^ 2.2.


const socket = io(url)

socket.on('connection', client => {
  socket.of('/').in("some_room_name").clients((err, clients) => {
    console.log(clients) // an array of socket ids
  })
})




0
Isaac Pak