node.js socket.io socket.io-1.0

node.js - Cómo obtener la lista de clientes de la habitación en socket.io 1.0



socket.io-1.0 (5)

A partir de, al menos, el método 1.4.5 nha ya no funciona, y todavía no hay una API pública para conseguir clientes en una sala. Esto es lo que funciona para mí.

io.sockets.adapter.rooms[roomId] devuelve un objeto que tiene dos propiedades, sockets y longitud. El primero es otro objeto que tiene socketId para claves y boolean como valores:

Room { sockets: { ''/#vQh0q0gVKgtLGIQGAAAB'': true, ''/#p9Z7l6UeYwhBQkdoAAAD'': true }, length: 2 }

Entonces mi código para obtener clientes se ve así:

var sioRoom = io.sockets.adapter.rooms[roomId]; if( sioRoom ) { Object.keys(sioRoom.sockets).forEach( function(socketId){ console.log("sioRoom client socket Id: " + socketId ); }); }

Puedo obtener la lista de clientes de la sala con este código en socket.io 0.9.

io.sockets.clients(roomName)

¿Cómo puedo hacer esto en socket.io 1.0?


Para aquellos de ustedes que usan espacios de nombres, también realicé una función que puede manejar diferentes espacios de nombres. Es bastante similar a la respuesta de nha.

function get_users_by_room(nsp, room) { var users = [] for (var id in io.of(nsp).adapter.rooms[room]) { users.push(io.of(nsp).adapter.nsp.connected[id]); }; return users; };



Utilizando el enlace @ryan_Hdot , hice una pequeña función temporal en mi código, lo que evita mantener un parche. Aquí está :

function getClient(roomId) { var res = [], room = io.sockets.adapter.rooms[roomId]; if (room) { for (var id in room) { res.push(io.sockets.adapter.nsp.connected[id]); } } return res; }

Si usa un espacio de nombres:

function getClient (ns, id) { return io.nsps[ns].adapter.rooms[id] }

Que utilizo como una solución temporal para io.sockets.clients(roomId) que se convierte en findClientsSocketByRoomId(roomId) .

EDITAR:

La mayoría de las veces vale la pena considerar evitar el uso de este método si es posible.

Lo que hago ahora es que generalmente pongo un cliente en su propia habitación (es decir, en una habitación cuyo nombre es ID de cliente). Encontré el código más legible de esa manera, y ya no tengo que depender de esta solución.

Además, no he probado esto con un adaptador Redis.

Si es necesario, también vea esta pregunta relacionada si está usando espacios de nombres.


Considere esta respuesta bastante más completa vinculada en un comentario anterior sobre la pregunta: https://.com/a/24425207/1449799

Los clientes en una habitación se pueden encontrar en

io.nsps[yourNamespace].adapter.rooms[roomName]

Esta es una matriz asociativa con claves que son identificadores de socket. En nuestro caso, queríamos saber la cantidad de clientes en una sala, así que hicimos Object.keys(io.nsps[yourNamespace].adapter.rooms[roomName]).length

En caso de que no haya visto / usado espacios de nombres (como este tipo [me]), puede obtener más información aquí http://socket.io/docs/rooms-and-namespaces/ (importante: el espacio de nombres predeterminado es ''/ '')

Actualizado (especialmente para @Zettam):

revise este informe para ver cómo funciona: https://github.com/thegreatmichael/socket-io-clients