J'essaye d'obtenir une liste de toutes les sockets / clients qui sont actuellement connectés.
io.sockets
ne renvoie pas de tableau, malheureusement.
Je sais que je pourrais garder ma propre liste en utilisant un tableau, mais ne pense pas que ce soit une solution optimale pour 2 raisons:
Redondance. Socket.IO conserve déjà une copie de cette liste.
Socket.IO fournit une méthode pour définir des valeurs de champ arbitraires pour les clients (c'est-à-dire:),
socket.set('nickname', 'superman')
donc je devrais suivre ces changements si je devais maintenir ma propre liste.
Aidez-moi?
socket
est id,io.sockets.sockets[socket]
est la socket.err
et si vous utilisez le stockage de mémoire, c'est toujoursnull
..get('nickname', function(err, nickname) { ... })
Réponses:
Dans Socket.IO 0.7, vous avez une
clients
méthode sur les espaces de noms, cela renvoie un tableau de toutes les sockets connectées.API pour aucun espace de noms:
Pour un espace de noms
Espère que cela aide quelqu'un à l'avenir
MISE À JOUR 2020 Mar 06
À partir de 1.x et au-dessus, veuillez vous référer à ce lien: obtenir combien de personnes sont dans une salle de chat dans socket.io
la source
connected
objet de l'espace de noms.var clients = io.sockets.connected();
ne fonctionne évidemment pas. MerciSocket.io 1.4
Object.keys(io.sockets.sockets);
vous donne toutes les prises connectées.Socket.io 1.0 Depuis socket.io 1.0, la réponse acceptée n'est plus valide. J'ai donc créé une petite fonction que j'utilise comme solution temporaire:
Api for No namespace devient
Api pour un espace de noms devient:
Voir aussi cette question connexe , dans laquelle je donne une fonction qui renvoie les sockets pour une pièce donnée.
Socket.io 0.7
API pour aucun espace de noms :
Pour un espace de noms
Remarque: comme il semble que l'API socket.io est susceptible de se casser et que certaines solutions reposent sur des détails d'implémentation, il peut s'agir de suivre les clients vous-même:
la source
Après socket.io 1.0, nous ne pouvons pas utiliser
plus. Au lieu de cela, vous pouvez utiliser ce qui suit
la source
var clients_in_the_room = io.sockets.adapter.rooms[roomId].sockets
Utilisation de Socket.IO 1.x:
Obtenez un tableau des clients connectés:
Obtenez le nombre de clients connectés:
la source
Très simple dans socket.io 1.3:
io.sockets.sockets
- est un tableau contenant les objets socket connectés. Si vous avez stocké le nom d'utilisateur dans chaque socket, vous pouvez faire:Boom. Vous avez les noms de tous les utilisateurs connectés.
la source
(Object.keys(io.engine.clients)
J'ai traversé cette douleur aujourd'hui. Socket.io sera bien meilleur s'ils pouvaient créer une documentation appropriée pour leur API.
Quoi qu'il en soit, j'ai essayé de regarder dans io.sockets et j'ai trouvé un certain nombre d'options que nous pouvons utiliser:
Notez également que lorsque vous utilisez socket.io avec namespace, les méthodes ci-dessus seront interrompues car io.sockets devient un tableau au lieu d'un objet. Pour résoudre, remplacez simplement io.sockets par io (c'est-à-dire que io.sockets.connected devient io.connected, io.sockets.adapter.rooms devient io.adapter.rooms ...)
Testé sur socket.io 1.3.5
la source
Version +2.0
Dans la version +2.0, vous spécifiez l'espace de noms / la salle / le nœud sur lequel vous interrogez.
Comme pour la diffusion, la valeur par défaut est tous les clients de l'espace de noms par défaut ('/'):
Obtient une liste des ID client connectés à un espace de noms spécifique (sur tous les nœuds, le cas échéant).
Un exemple pour obtenir tous les clients dans la salle de l'espace de noms:
Ceci provient de la documentation officielle: Socket.IO Server-API
la source
socket.username
propriété à chaque socket lors de la connexion, y a-t-il un moyen pour afficher tous ces objets socket (y compris les propriétés personnalisées que j'ajoute à chaque socket)? (pour référence, j'utilise actuellement une variable d'objet globale pour stocker des informations de socket supplémentaires lorsqu'un client se connecte - donc je ne demande pas comment configurer cela - juste intéressé à savoir s'il existe un moyen d'afficher tous les objets de socket par `` défaut '') .console.log(io.sockets.connected)
- il semble être un objet où chaque valeur de la propriété est un « objet socket » qui contient ces propriétésnsp
,server
,adaptor
,id
(une chaîne),client
,conn
,rooms
,acks
,connected
,disconnected
,handshake
,fns
,flags
,_rooms
,_events
,_eventsCount
et enfinusername
qui est la propriété personnalisée i ajouter à chaque prise de connexion.Je pense que nous pouvons accéder à l'objet socket depuis le serveur, et vous pouvez attribuer le surnom et pointer son identifiant de socket,
Le
disconnect
veuillez supprimer le pseudo deio.sockets.sockets
.la source
C'est le meilleur moyen d'y accéder dans socket.io 1.3
Object.keys(socket.adapter.rooms[room_id])
la source
var room = io.sockets.adapter.rooms[room_id];
var connections = _.map(Object.keys(room), function(socketId){ return (io.sockets.connected[socketId].connected == true) });
Pour tous ceux qui veulent juste un COUNT des clients connectés, je pense que cela le fera:
io.sockets.manager.server.connections
la source
io.sockets.clients().length
io.sockets.manager.server.connections
etio.sockets.clients().length
ne fonctionnent pas. Cela a fonctionné pour moi - pour le décompte seulement -io.engine.clientsCount
et pour la liste des clients -io.engine.clientsCount
. Depuis, il est resté ainsi pendant plus de 3 ans. Cela semble être un moyen fiable d'obtenir les informations de connexion. (Basé sur la réponse de Joseph Dykstra)Socket.io 1.4.4
Exemple de code pour vous.
Je pense que cela aidera quelqu'un à bloquer ce code.
la source
Dans Socket.IO 1.4
Pour obtenir le tableau de tous les utilisateurs connectés:
Pour obtenir le nombre de tous les clients:
la source
À partir de socket.io 1.5, notez le changement de indexOf qui semble déprécié, et remplacé par valueOf
Pour socket.io version 2.0.3, le code suivant fonctionne:
la source
sur socket.io 1.3 j'ai accompli cela en 2 lignes
la source
Socket.io 1.7.3 (+):
la source
Pour la version 2.3, cela fonctionne et vous obtiendrez le socket aussi , il me semble que socketIo change trop vite et trop avec une documentation peu lisible après l'avoir utilisé pendant un certain temps.
toujours cela ne me semble pas bien, car j'ai toujours ce sentiment avec socket Io en quelque sorte
la source
Je crois que vous pouvez y accéder à partir de la propriété manager du socket?
la source
Je vois beaucoup de bonnes réponses ici et beaucoup étaient très utiles mais pas tout à fait ce dont j'avais besoin. J'utilise des sockets pour une fonctionnalité pubsub dans laquelle un client intéressé peut écouter les modifications dans un enregistrement donné.
Mon problème spécifique était que la même prise rejoignait la même pièce plusieurs fois. La solution à cela était de vérifier si la prise avait déjà la pièce à l'intérieur de sa propriété rooms.
J'espère que cela aide quelqu'un.
la source
C'est le moyen le plus simple dans Socket.IO 1.0+, si vous n'utilisez pas d'espaces de noms ou de salles.
Cela examine l'espace de noms par défaut et détermine la longueur du tableau de sockets, sans avoir besoin d'utiliser
Object.keys()
la source
Depuis la version 1.5.1, je peux accéder à toutes les sockets d'un espace de noms avec:
Pour une raison quelconque, ils utilisent un objet simple au lieu d'un tableau pour stocker les ID de socket.
la source
of()
appel en chaîne dans ce cas.Pour le mode cluster, à l'aide de l'adaptateur redis
Comme chaque socket est elle-même une pièce, on peut donc trouver si une prise existe en utilisant la même.
la source
Voici un moyen rapide de convertir le hachage des sockets connectés d'un espace de noms en un tableau à l'aide de générateurs ES6 (s'applique à socket.io> = v1.0.0):
la source
Je ne sais pas si cela continue. Mais quelque chose comme ça, c'est ce que j'ai fini par utiliser (je garde un objet de session sur chaque socket connectée, qui à son tour contient le nom d'utilisateur et d'autres informations:
la source
Si le projet a un cluster socket.io , cela signifie que l' adaptateur socket.io-redis est utilisé.
Si le cas est similaire à celui ci-dessus, l'obtention du processus d'identification de tous les sockets connectés doit être appliquée via l' adaptateur socket.io-redis . Les exemples ci-dessous peuvent être utilisés pour cela;
Veuillez visiter la page github de socket.io-redis pour plus de détails.
la source
[email protected]
J'ai utilisé Object.Keys pour connecter le tableau de socket. Ensuite, dans le même tableau, itérez avec la fonction de carte pour créer un nouveau tableau d'objets
Peut-être que cette réponse peut aider à obtenir le tableau id / nom d'utilisateur de socket.
la source
v.10
la source
socket.io 2.1.1
, j'obtiensTypeError: clients.map is not a function
et même si cela semble prometteur, je ne suis pas tout à fait sûr de ce que l'exemple ci-dessus va réaliser - j'espérais qu'il créerait automatiquement un tableau d'objets clients avec les noms d'utilisateur inclus :).