Ich versuche, eine Liste aller Sockets / Clients zu erhalten, die derzeit verbunden sind.
io.sockets
gibt leider kein Array zurück.
Ich weiß, dass ich meine eigene Liste mit einem Array führen könnte, denke aber aus zwei Gründen nicht, dass dies eine optimale Lösung ist:
Redundanz. Socket.IO behält bereits eine Kopie dieser Liste.
Socket.IO bietet eine Methode zum Festlegen beliebiger Feldwerte für Clients (dh :),
socket.set('nickname', 'superman')
sodass ich mit diesen Änderungen Schritt halten muss, wenn ich meine eigene Liste verwalten möchte.
Hilfe?
socket
ist id,io.sockets.sockets[socket]
ist die Steckdose.err
und wenn Sie Speicher verwenden, ist es immernull
..get('nickname', function(err, nickname) { ... })
Antworten:
In Socket.IO 0.7 haben Sie eine
clients
Methode für die Namespaces, die ein Array aller verbundenen Sockets zurückgibt.API für keinen Namespace:
Für einen Namespace
Hoffe das hilft jemandem in der Zukunft
AKTUALISIERT 2020 Mar 06
Ab 1.x und höher verweisen Sie bitte auf diesen Link: Ermitteln Sie, wie viele Personen sich in einem Chatroom in socket.io befinden
quelle
connected
Objekt des Namespace verwenden.var clients = io.sockets.connected();
funktioniert offensichtlich nicht. Vielen DankSocket.io 1.4
Object.keys(io.sockets.sockets);
gibt Ihnen alle angeschlossenen Steckdosen.Socket.io 1.0 Ab socket.io 1.0 ist die tatsächlich akzeptierte Antwort nicht mehr gültig. Also habe ich eine kleine Funktion erstellt, die ich als vorübergehende Korrektur verwende:
API für No Namespace wird
API für einen Namespace wird:
Siehe auch diese verwandte Frage , in der ich eine Funktion gebe, die die Sockets für einen bestimmten Raum zurückgibt.
Socket.io 0.7
API für keinen Namespace :
Für einen Namespace
Hinweis: Da die socket.io-API anscheinend fehleranfällig ist und einige Lösungen auf Implementierungsdetails beruhen, kann es eine Frage der Verfolgung der Clients selbst sein:
quelle
Nach socket.io 1.0 können wir nicht verwenden
nicht mehr. Stattdessen können Sie Folgendes verwenden
quelle
var clients_in_the_room = io.sockets.adapter.rooms[roomId].sockets
Verwenden von Socket.IO 1.x:
Array der verbundenen Clients abrufen:
Ermitteln Sie die Anzahl der verbundenen Clients:
quelle
Sehr einfach in socket.io 1.3:
io.sockets.sockets
- ist ein Array, das die verbundenen Socket-Objekte enthält. Wenn Sie den Benutzernamen in jedem Socket gespeichert haben, können Sie Folgendes tun:Boom. Sie haben die Namen aller verbundenen Benutzer.
quelle
(Object.keys(io.engine.clients)
Ich habe heute diesen Schmerz durchgemacht. Socket.io ist viel besser, wenn sie eine ordnungsgemäße Dokumentation für ihre API erstellen könnten.
Wie auch immer, ich habe versucht, in io.sockets zu suchen und eine Reihe von Optionen gefunden, die wir verwenden können:
Beachten Sie außerdem, dass bei Verwendung von socket.io mit Namespace die oben genannten Methoden nicht mehr funktionieren, da io.sockets zu einem Array anstelle eines Objekts wird. Um dies zu beheben, ersetzen Sie einfach io.sockets durch io (dh io.sockets.connected wird zu io.connected, io.sockets.adapter.rooms wird zu io.adapter.rooms ...)
Getestet auf socket.io 1.3.5
quelle
Version +2.0
In Version +2.0 geben Sie den Namespace / Raum / Knoten an, für den Sie eine Abfrage durchführen.
Wie beim Broadcasting sind standardmäßig alle Clients aus dem Standard-Namespace ('/'):
Ruft eine Liste der Client-IDs ab, die mit einem bestimmten Namespace verbunden sind (ggf. über alle Knoten hinweg).
Ein Beispiel, um alle Clients in den Raum des Namespace zu bringen:
Dies ist aus der offiziellen Dokumentation: Socket.IO Server-API
quelle
socket.username
jedem Socket beim Verbinden eine Eigenschaft hinzufüge , gibt es eine Möglichkeit, alle diese Socket-Objekte anzuzeigen (einschließlich der benutzerdefinierten Eigenschaften, die ich jedem Socket hinzufüge)? (Als Referenz verwende ich derzeit eine globale Objektvariable, um zusätzliche Socket-Informationen zu speichern, wenn ein Client eine Verbindung herstellt - ohne zu fragen, wie dies eingerichtet werden soll -, nur um zu wissen, ob es eine Möglichkeit gibt, alle Socket-Objekte standardmäßig anzuzeigen.) .console.log(io.sockets.connected)
- es scheint , ein Objekt zu sein , wo jeder Eigenschaftswert ein „Socket - Objekt“ ist , die diese Eigenschaften enthältnsp
,server
,adaptor
,id
(ein String),client
,conn
,rooms
,acks
,connected
,disconnected
,handshake
,fns
,flags
,_rooms
,_events
,_eventsCount
und schließlichusername
das ist die benutzerdefinierte Eigenschaft i an jede Steckdose auf Verbindung hinzufügen.Ich denke, wir können vom Server aus auf das Socket-Objekt zugreifen, und Sie können den Spitznamen zuweisen und auf seine Socket-ID verweisen.
Am
disconnect
entfernen Sie bitte den Spitznamen vonio.sockets.sockets
.quelle
Dies ist der beste Weg, um in socket.io 1.3 darauf zuzugreifen
Object.keys(socket.adapter.rooms[room_id])
quelle
var room = io.sockets.adapter.rooms[room_id];
var connections = _.map(Object.keys(room), function(socketId){ return (io.sockets.connected[socketId].connected == true) });
Für jeden, der nur einen COUNT der verbundenen Clients möchte, glaube ich, dass dies das tun wird:
io.sockets.manager.server.connections
quelle
io.sockets.clients().length
io.sockets.manager.server.connections
undio.sockets.clients().length
nicht funktionieren. Dies funktionierte für mich - nurio.engine.clientsCount
für die Zählung - und für die Liste der Kunden -io.engine.clientsCount
. Da ist es seit über 3 Jahren so geblieben. Scheint ein zuverlässiger Weg zu sein, um die Verbindungsinformationen zu erhalten. (Basierend auf Joseph Dykstras Antwort)Socket.io 1.4.4
Beispielcode für Sie.
Ich denke, wird jemandem dieser Codeblock helfen.
quelle
In Socket.IO 1.4
So erhalten Sie das Array aller verbundenen Benutzer:
So ermitteln Sie die Anzahl aller Clients:
quelle
Beachten Sie ab socket.io 1.5 die Änderung von indexOf, die anscheinend abgeschrieben und durch valueOf ersetzt wird
Für socket.io Version 2.0.3 funktioniert der folgende Code:
quelle
auf socket.io 1.3 habe ich dies in 2 Zeilen erreicht
quelle
Socket.io 1.7.3 (+):
quelle
Für Version 2.3 funktioniert dies und Sie erhalten auch den Socket . Es scheint mir, dass sich SocketIo nach einer Weile zu schnell und zu viel mit zu wenig lesbarer Dokumentation ändert.
Trotzdem fühlt sich das nicht richtig an, da ich immer irgendwie dieses Gefühl mit Sockel Io habe
quelle
Ich glaube, Sie können über die Manager-Eigenschaft des Sockets darauf zugreifen.
quelle
Ich sehe hier viele gute Antworten und viele waren sehr nützlich, aber nicht ganz das, was ich brauchte. Ich verwende Sockets für eine Pubsub-Funktion, mit der ein interessierter Client Änderungen in einem bestimmten Datensatz anhören kann.
Mein spezielles Problem war, dass dieselbe Steckdose mehrmals in denselben Raum kam. Die Lösung hierfür bestand darin, zu überprüfen, ob die Steckdose den Raum bereits in ihrem Zimmerbesitz hatte.
Hoffe das hilft jemandem.
quelle
Dies ist der einfachste Weg in Socket.IO 1.0+, wenn Sie keine Namespaces oder Räume verwenden.
Dadurch wird der Standard-Namespace überprüft und die Länge des Sockets-Arrays bestimmt, ohne dass eine Verwendung erforderlich ist
Object.keys()
quelle
Ab Version 1.5.1 kann ich auf alle Sockets in einem Namespace zugreifen mit:
Aus irgendeinem Grund verwenden sie ein einfaches Objekt anstelle eines Arrays, um die Socket-IDs zu speichern.
quelle
of()
verketteten Anruf in diesem Fall vollständig entfernen .Verwenden Sie für den Cluster-Modus den Redis-Adapter
Da jede Steckdose selbst ein Raum ist, kann man feststellen, ob eine Steckdose mit derselben vorhanden ist.
quelle
Hier ist eine schnelle Möglichkeit, den Hash verbundener Sockets mithilfe von ES6-Generatoren aus einem Namespace in ein Array zu konvertieren (gilt für socket.io> = v1.0.0):
quelle
Ich weiß nicht, ob das noch geht. Aber so etwas habe ich letztendlich verwendet (ich behalte ein Sitzungsobjekt auf jedem verbundenen Socket, das wiederum den Benutzernamen und andere Informationen enthält:
quelle
Wenn das Projekt einen socket.io- Cluster hat, bedeutet dies, dass der Socket.io-redis- Adapter verwendet wird.
Wenn der Fall wie oben beschrieben ist, muss das Abrufen des ID-Prozesses für alle verbundenen Sockets über den Adapter socket.io-redis angewendet werden. Die folgenden Beispiele könnten hierfür verwendet werden.
Bitte besuchen Sie die Socket.io-Redis Github Seite für weitere Details.
quelle
[email protected]
Ich habe Object.Keys verwendet, um das Array der Sockets zu verbinden. Dann iterieren Sie im selben Array mit der Kartenfunktion, um ein neues Array von Objekten zu erstellen
Vielleicht kann diese Antwort helfen, Socket-ID / Benutzername-Array zu erhalten.
quelle
v.10
quelle
socket.io 2.1.1
, erhalte ich ,TypeError: clients.map is not a function
und obwohl es sieht vielversprechend aus, ich bin nicht ganz sicher , was das obige Beispiel erreichen - ich hatte gehofft , dass es automatisch eine Reihe von Client - Objekten erstellen würde mit Benutzernamen :) enthalten.