Socket.IO - comment puis-je obtenir une liste des sockets connectées/clients?
Je vais essayer d'obtenir une liste de tous les sockets/clients actuellement connectés.
io.sockets
ne pas retourner un tableau, malheureusement.
Je sais que je pourrais garder mon propre liste à l'aide d'un tableau, mais ne pense pas que c'est une solution optimale pour 2 raisons:
-
De la redondance. Socket.IO déjà conserve une copie de cette liste.
-
Socket.IO fournit une méthode pour fixer arbitrairement les valeurs de champ pour les clients (j'.e:
socket.set('nickname', 'superman')
) donc j'aurais besoin pour faire face à ces changements si j'étais à maintenir mon propre liste.
Aider?
- Ne pouvez-vous pas tout simplement de convertir io.douilles à un tableau?
- Non, io.sockets est en fait un objet complexe et ne se contente pas de stocker une liste d'objets socket. Pour l'instant, je vais gérer ma propre liste d'objets utilisateur et d'éviter à l'aide de la douille.fonction set ().
- Dans 0.7.6 io.les sockets.sockets est un simple objet de hachage id => socket
- J'ai remarqué que, mais il se comporte de façon étrange (ne semble pas être prise standard des objets). Pour exemple, j'ai essayé: pastebin.com/fxuzVckS mais c'est dire le socket ne contient pas de 'get' méthode.
socket
est id,io.sockets.sockets[socket]
est le support.- La droite. Qui fait sens. J'ai essayé le code suivant: pastebin.com/kJcHzpvV et il semble que le surnom de retourner null. Ce que je fais mal?
- Premier argument est
err
et si vous êtes en utilisant la mémoire de magasin, c'est toujoursnull
..get('nickname', function(err, nickname) { ... })
Vous devez vous connecter pour publier un commentaire.
Dans Le Support.IO de 0,7 vous avez un
clients
méthode sur les espaces de noms, cela retourne un tableau de tous les sockets connectées.API pour aucun espace de noms:
Pour un espace de noms
Espérant que cela aide quelqu'un dans le futur
connected
objet de l'espace de noms.var clients = io.sockets.connected();
de toute évidence ne fonctionne pas. MerciSocket.io 1.4
Object.keys(io.sockets.sockets);
vous donne tous les sockets connectées.Socket.io 1.0
Que de la prise.io 1.0, le réel accepté réponse n'est pas plus valable.
J'ai donc fait une petite fonction que j'utilise comme une solution temporaire :
Api pour Aucun espace de noms devient
Api pour un espace de noms devient :
Aussi voir ce une question relative à la, dans laquelle je donne une fonction qui renvoie les sockets pour une pièce donnée.
Socket.io de 0,7
API pour aucun espace de noms:
Pour un espace de noms
Remarque: Depuis, il semble que le socket.io API est sujette à la rupture, et une solution compter sur les détails de mise en œuvre, il pourrait être une question de suivi des clients-vous:
Après la prise.io 1.0 nous ne pouvons pas utiliser
plus. Au lieu de cela, vous pouvez utiliser les éléments suivants
var clients_in_the_room = io.sockets.adapter.rooms[roomId].sockets
À L'Aide D'Une Douille.IO 1.x:
Obtenir le tableau des clients connectés:
Obtenir le nombre de clients connectés:
Très simple dans le support.io 1.3:
io.sockets.sockets
- est un tableau contenant le socket connecté objets.Si vous avez stocké le nom d'utilisateur dans chaque support, que vous pouvez faire:
Boom. Vous avez les noms de tous les utilisateurs connectés.
(Object.keys(io.engine.clients)
Je suis passé par cette douleur aujourd'hui. Socket.io sera beaucoup mieux si ils pouvaient faire une documentation appropriée pour leur API.
De toute façon, j'ai essayé de regarder dans les io.les sockets et trouvé un certain nombre d'options que vous pouvez utiliser:
Aussi, notez que lors de l'utilisation de socket.io avec l'espace de noms, les méthodes ci-dessus va casser depuis io.sockets devient un tableau au lieu d'un objet. Pour le résoudre, il suffit de remplacer io.sockets par io (j'.e io.les sockets.connecté devient io.connecté, io.les sockets.l'adaptateur.chambres devient io.l'adaptateur.les chambres ...)
Testé sur la socket.io 1.3.5
io.sockets.server.eio.clientsCount
faire le travail.Je pense que nous pouvons accéder à la prise de l'objet à partir du serveur, et vous pouvez attribuer le surnom, et le point de son socket id,
Sur
disconnect
veuillez supprimer le surnom deio.sockets.sockets
.Version +2.0
Dans la version +2.0 vous spécifier l'espace de noms/chambre/nœud de vous interroger.
Comme avec la radiodiffusion, la valeur par défaut est tous les clients à partir de l'espace de noms par défaut ('/'):
Obtient une liste d'Id client connecté à l'espace de noms spécifique (à travers tous les nœuds si applicable).
Un exemple pour obtenir tous les clients dans l'espace de noms de la chambre:
C'est à partir de la documentation officielle: Socket.IO Server API
socket.username
propriété à chaque prise de raccordement, est-il un moyen pour que je puisse visualiser l'ensemble de ces objets socket (y compris les propriétés personnalisées-je ajouter à chaque prise)? (pour référence, je suis actuellement en utilisant un objet global variable d'enregistrer d'autres informations sur le socket lorsqu'un client se connecte donc pas se demander comment le mettre en place que - seulement intéressé à savoir si il existe un moyen pour afficher tous les objets socket par "par défaut").console.log(io.sockets.connected)
- il semble être un objet où chaque valeur de propriété est un "socket" qui contient ces propriétésnsp
,server
,adaptor
,id
( une chaîne de caractères),client
,conn
,rooms
,acks
,connected
,disconnected
,handshake
,fns
,flags
,_rooms
,_events
,_eventsCount
et enfinusername
qui est la propriété personnalisée-je ajouter à chaque prise de connexion.C'est le meilleur moyen d'y accéder dans le support.io 1.3
Object.keys(socket.adapter.rooms[room_id])
var room = io.sockets.adapter.rooms[room_id];
var connections = _.map(Object.keys(room), function(socketId){ return (io.sockets.connected[socketId].connected == true) });
Pour quelqu'un qui veut juste un nombre de clients connectés je crois que ça va le faire:
io.sockets.manager.server.connections
io.sockets.clients().length
io.sockets.manager.server.connections
etio.sockets.clients().length
ne fonctionnent pas. Cela a fonctionné pour moi - Pour compter uniquement -io.engine.clientsCount
et la liste des clients -io.engine.clientsCount
. Depuis, il est resté de cette façon pendant plus de 3 ans. Semble comme un moyen fiable pour obtenir les informations de connexion. (Basé sur Joseph Dykstra réponse)Socket.io 1.4.4
Exemple de code pour vous.
Je pense va aider quelqu'un à ce bloc de code.
Dans Le Support.IO 1.4
Pour obtenir la matrice de Tous les Utilisateurs connectés :
Pour obtenir le nombre de tous les clients :
Que de la prise.io 1.5, note le changement de indexOf qui semble de se déprécier, et remplacé par valueOf
Pour la socket.io de la version 2.0.3, le code suivant fonctionne:
sur la socket.io 1.3, j'ai accompli cela en 2 lignes
Socket.io 1.7.3(+) :
Je crois que vous pouvez y accéder à partir de la prise du gestionnaire de la propriété?
Je vois beaucoup de bonnes réponses ici et beaucoup d'où, très utile, mais pas tout à fait ce dont j'avais besoin. Je suis à l'aide de sockets pour un pubsub fonction permettant à un client intéressé peut écouter les modifications apportées à un enregistrement donné.
Mon problème est que le même socket a été rejoint la même pièce plusieurs fois. La solution à ce problème est de vérifier si le socket eu la chambre à l'intérieur de ses chambres bien déjà.
Espère que cela aide quelqu'un.
C'est la façon la plus simple dans le support.IO 1.0+, si vous n'êtes pas en utilisant les espaces de noms ou de chambres.
Cela ressemble à l'espace de noms par défaut et détermine la longueur des prises de tableau, sans avoir à utiliser
Object.keys()
De la version 1.5.1, je suis en mesure d'accéder à tous les sockets dans un espace de noms avec:
Pour une raison quelconque, ils sont à l'aide d'un objet ordinaire au lieu d'un tableau pour stocker l'Id de socket.
of()
enchaîné d'appel dans cette affaire.Pour la version 2.3 de ce qui fonctionne et il vous permettra d'obtenir une prise trop, il me semble que socketIo est en train de changer trop vite et bien avec à peu lisible de la documentation pour l'avoir utilisé pendant un certain temps.
encore cela ne me sens pas le droit, comme je l'ai toujours ce sentiment avec la socket Io en quelque sorte
Pour le mode cluster, à l'aide de redis-adaptateur
Que chaque support est lui-même une pièce, de sorte que l'on peut trouver si un socket existe à l'aide de la même.
Ici est un moyen rapide de convertir la valeur de hachage de sockets connectées à partir d'un espace de noms dans un tableau à l'aide ES6 générateurs (s'applique à douille.io >= v1.0.0):
Je ne sais pas si c'est toujours en cours. Mais quelque chose comme ceci est ce que j'ai utilisé (je garde un session objet sur chaque socket connecté, qui à son tour contient le nom d'utilisateur et d'autres informations:
Si le projet a un socket.io cluster cela signifie socket.io-redis adaptateur est utilisé.
Si le cas comme ci-dessus, l'obtention de la tous les sockets connectées processus d'identification doit être appliquée par socket.io-redis adaptateur. Les exemples ci-dessous peut être utilisé pour cela;
Veuillez visiter socket.io-redis page github pour plus de détails.
[email protected]
J'ai utilisé de l'Objet.Les clés pour obtenir la matrice de prise connectée. Puis dans le même tableau itérer avec la fonction map de construire un nouveau tableau d'objets
Peut-être cette réponse peut aider à obtenir socket id/nom d'utilisateur de tableau.
v. 10
socket.io 2.1.1
, je reçoisTypeError: clients.map is not a function
et bien qu'il semble prometteur, je ne suis pas entièrement sûr de ce que l'exemple ci-dessus va obtenir - j'espérais que ce serait automagiquement créer un tableau d'objets client avec des noms d'utilisateur inclus :).