La guía paso a paso o código que verás en este post es la resolución más sencilla y válida que encontramos a esta inquietud o dilema.
Solución:
En Socket.IO 0.7 tienes un clients
método en los espacios de nombres, esto devuelve un array de todos los enchufes conectados.
API sin espacio de nombres:
var clients = io.sockets.clients();
var clients = io.sockets.clients('room'); // all users from room `room`
Para un espacio de nombres
var clients = io.of('/chat').clients();
var clients = io.of('/chat').clients('room'); // all users from room `room`
Espera que esto ayude a alguien en el futuro.
NOTA: Esta solución SOLAMENTE funciona con la versión anterior a la 1.0
ACTUALIZADO 2020 Mar 06
A partir de la versión 1.x y superior, consulte este enlace: obtener cuántas personas hay en una sala de chat en socket.io
Zócalo.io 1.4
Object.keys(io.sockets.sockets);
te da todos los enchufes conectados.
Zócalo.io 1.0
A partir de socket.io 1.0, la respuesta aceptada real ya no es válida. Así que hice una pequeña función que uso como solución temporal:
function findClientsSocket(roomId, namespace)
API para Sin espacio de nombres se convierte
// var clients = io.sockets.clients();
// becomes :
var clients = findClientsSocket();
// var clients = io.sockets.clients('room');
// all users from room `room`
// becomes
var clients = findClientsSocket('room');
API para un espacio de nombres se convierte en:
// var clients = io.of('/chat').clients();
// becomes
var clients = findClientsSocket(null, '/chat');
// var clients = io.of('/chat').clients('room');
// all users from room `room`
// becomes
var clients = findClientsSocket('room', '/chat');
También vea esta pregunta relacionada, en la que doy una función que devuelve los enchufes para una habitación determinada.
function findClientsSocketByRoomId(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;
Zócalo.io 0.7
API para sin espacio de nombres:
var clients = io.sockets.clients();
var clients = io.sockets.clients('room'); // all users from room `room`
Para un espacio de nombres
var clients = io.of('/chat').clients();
var clients = io.of('/chat').clients('room'); // all users from room `room`
Nota: Dado que parece que la API de socket.io es propensa a romperse, y algunas soluciones se basan en los detalles de implementación, podría ser una cuestión de rastrear a los clientes usted mismo:
var clients = [];
io.sockets.on('connect', function(client)
clients.push(client);
client.on('disconnect', function()
clients.splice(clients.indexOf(client), 1);
);
);
Después de socket.io 1.0 no podemos usar
io.sockets.clients();
or
io.sockets.clients('room');
ya no. En su lugar, puede usar lo siguiente
var clients_in_the_room = io.sockets.adapter.rooms[roomId];
for (var clientId in clients_in_the_room )
console.log('client: %s', clientId); //Seeing is believing
var client_socket = io.sockets.connected[clientId];//Do whatever you want with this
Eres capaz de añadir valor a nuestro contenido informacional tributando tu veteranía en las observaciones.