Estoy tratando de obtener una lista de todos los sockets / clientes que están conectados actualmente.
io.sockets
no devuelve una matriz, desafortunadamente.
Sé que podría mantener mi propia lista usando una matriz, pero no creo que esta sea una solución óptima por 2 razones:
Redundancia. Socket.IO ya guarda una copia de esta lista.
Socket.IO proporciona un método para establecer valores de campo arbitrarios para los clientes (es decir:),
socket.set('nickname', 'superman')
por lo que necesitaría mantenerme al día con estos cambios si tuviera que mantener mi propia lista.
¿Ayuda?
socket
es id,io.sockets.sockets[socket]
es el zócalo.err
y si está utilizando el almacén de memoria es siemprenull
..get('nickname', function(err, nickname) { ... })
Respuestas:
En Socket.IO 0.7 tiene un
clients
método en los espacios de nombres, esto devuelve una matriz de todos los sockets conectados.API para ningún espacio de nombres:
Para un espacio de nombres
Espera que esto ayude a alguien en el futuro
ACTUALIZADO 2020 Mar 06
Desde 1.xy superior, consulte este enlace: obtener cuántas personas hay en una sala de chat en socket.io
fuente
connected
objeto del espacio de nombres.var clients = io.sockets.connected();
Obviamente no funciona. GraciasSocket.io 1.4
Object.keys(io.sockets.sockets);
te da todos los enchufes conectados.Socket.io 1.0 A partir de socket.io 1.0, la respuesta real aceptada ya no es válida. Entonces hice una pequeña función que uso como una solución temporal:
Api para Sin espacio de nombres se convierte
La API para un espacio de nombres se convierte en:
También vea esta pregunta relacionada , en la que le doy una función que devuelve los sockets para una habitación determinada.
Socket.io 0.7
API para ningún espacio de nombres :
por un espacio de nombres
Nota: Dado que parece que la API socket.io es propensa a romperse, y algunas soluciones dependen de los detalles de implementación, podría ser una cuestión de rastrear a los clientes usted mismo:
fuente
Después de socket.io 1.0 no podemos usar
nunca más. En su lugar, puede usar lo siguiente
fuente
var clients_in_the_room = io.sockets.adapter.rooms[roomId].sockets
Usando Socket.IO 1.x:
Obtenga una variedad de clientes conectados:
Obtenga el número de clientes conectados:
fuente
Muy simple en socket.io 1.3:
io.sockets.sockets
- es una matriz que contiene los objetos de socket conectados. Si almacenó el nombre de usuario en cada socket, puede hacer:Auge. Tienes los nombres de todos los usuarios conectados.
fuente
(Object.keys(io.engine.clients)
He pasado por este dolor hoy. Socket.io sería mucho mejor si pudieran hacer una documentación adecuada para su API.
De todos modos, traté de buscar en io.sockets y encontré varias opciones que podemos usar:
Además, tenga en cuenta que cuando use socket.io con el espacio de nombres, los métodos anteriores se romperán ya que io.sockets se convierte en una matriz en lugar de un objeto. Para resolverlo, simplemente reemplace io.sockets por io (es decir, io.sockets.connected se convierte en io.connected, io.sockets.adapter.rooms se convierte en io.adapter.rooms ...)
Probado en socket.io 1.3.5
fuente
Versión +2.0
En la versión +2.0, especifica el espacio de nombres / sala / nodo contra el que está consultando.
Al igual que con la transmisión, el valor predeterminado es todos los clientes del espacio de nombres predeterminado ('/'):
Obtiene una lista de ID de clientes conectados a un espacio de nombres específico (en todos los nodos, si corresponde).
Un ejemplo para obtener todos los clientes en la sala del espacio de nombres:
Esto es de la documentación oficial: Socket.IO Server-API
fuente
socket.username
propiedad a cada socket en la conexión, ¿hay alguna manera de ver todos estos objetos de socket (incluidas las propiedades personalizadas que agrego a cada socket)? (como referencia, actualmente estoy usando una variable de objeto global para almacenar información de socket adicional cuando un cliente se conecta, por lo que no estoy preguntando cómo configurarlo, solo estoy interesado en saber si hay una manera de ver todos los objetos de socket de forma predeterminada) .console.log(io.sockets.connected)
- parece ser un objeto que cada valor de la propiedad es un "objeto socket", que contiene estas propiedadesnsp
,server
,adaptor
,id
(una cadena),client
,conn
,rooms
,acks
,connected
,disconnected
,handshake
,fns
,flags
,_rooms
,_events
,_eventsCount
y, finalmente,username
que es la propiedad personalizada agrego a cada zócalo de conexión.Creo que podemos acceder al objeto de socket desde el servidor, y puede asignar el apodo y señalar su id de socket,
En
disconnect
por favor elimine el apodo deio.sockets.sockets
.fuente
Esta es la mejor manera de acceder a ella en socket.io 1.3
Object.keys(socket.adapter.rooms[room_id])
fuente
var room = io.sockets.adapter.rooms[room_id];
var connections = _.map(Object.keys(room), function(socketId){ return (io.sockets.connected[socketId].connected == true) });
Para cualquiera que solo quiera un CONTEO de los clientes conectados, creo que esto lo hará:
io.sockets.manager.server.connections
fuente
io.sockets.clients().length
io.sockets.manager.server.connections
yio.sockets.clients().length
no funcionan. Esto funcionó para mí, solo para contar,io.engine.clientsCount
y para la lista de clientesio.engine.clientsCount
. Como se ha mantenido así durante más de 3 años. Parece una forma confiable de obtener la información de conexión. (Basado en la respuesta de Joseph Dykstra)Socket.io 1.4.4
Código de muestra para ti.
Creo que ayudará a alguien a bloquear este código.
fuente
En Socket.IO 1.4
Para obtener la matriz de Todos los usuarios conectados:
Para obtener el recuento de todos los clientes:
fuente
A partir de socket.io 1.5, observe el cambio de indexOf que parece depreciarse y reemplazarse por valueOf
Para socket.io versión 2.0.3, funciona el siguiente código:
fuente
en socket.io 1.3 he logrado esto en 2 líneas
fuente
Socket.io 1.7.3 (+):
fuente
Para la versión 2.3 esto funciona y también le dará el socket , me parece que socketIo está cambiando demasiado rápido y con mucha o poca documentación legible después de usarlo por un tiempo.
todavía esto no se siente bien, ya que siempre tengo este sentimiento con socket Io de alguna manera
fuente
¿Creo que puede acceder a esto desde la propiedad del administrador del socket?
fuente
Veo muchas buenas respuestas aquí y muchas fueron muy útiles, pero no exactamente lo que necesitaba. Estoy usando sockets para una función de pubsub en la que un cliente interesado puede escuchar cualquier cambio en un registro dado.
Mi problema específico era que el mismo conector se unía a la misma habitación varias veces. La solución a esto fue verificar si el zócalo ya tenía la habitación dentro de su propiedad.
Espero que esto ayude a alguien.
fuente
Esta es la forma más simple en Socket.IO 1.0+, si no está utilizando espacios de nombres o habitaciones.
Esto examina el espacio de nombres predeterminado y determina la longitud de la matriz de sockets, sin necesidad de usar
Object.keys()
fuente
A partir de la versión 1.5.1, puedo acceder a todos los sockets en un espacio de nombres con:
Por alguna razón, están usando un objeto simple en lugar de una matriz para almacenar las ID de socket.
fuente
of()
llamada encadenada en ese caso.Para el modo de clúster, usando redis-adapter
Como cada socket es en sí mismo una habitación, entonces uno puede encontrar si existe un socket usando el mismo.
fuente
Aquí hay una forma rápida de convertir el hash de los sockets conectados de un espacio de nombres a una matriz usando generadores ES6 (se aplica a socket.io> = v1.0.0):
fuente
No sé si esto todavía va. Pero algo como esto es lo que terminé usando (mantengo un objeto de sesión en cada socket conectado, que a su vez contiene el nombre de usuario y otra información:
fuente
Si el proyecto tiene un cluster socket.io, esto significa se está utilizando el adaptador socket.io-redis .
Si el caso es el anterior, se debe aplicar el proceso de identificación de todos los enchufes conectados a través del adaptador socket.io-redis . Los siguientes ejemplos podrían usarse para esto;
Visite la página socket.io-redis github para obtener más detalles.
fuente
[email protected]
Usé Object.Keys para conectar la matriz de socket. Luego, en la misma matriz, itere con la función de mapa para construir una nueva matriz de objetos
Quizás esta respuesta pueda ayudar a obtener la matriz de id / nombre de usuario del socket.
fuente
v.10
fuente
socket.io 2.1.1
, entiendoTypeError: clients.map is not a function
y, aunque parece prometedor, no estoy completamente seguro de lo que logrará el ejemplo anterior: esperaba que creara automáticamente una matriz de objetos de cliente con nombres de usuario incluidos :).