我正在尝试获取当前连接的所有套接字/客户端的列表。
不幸的是,io.sockets
不返回数组。
我知道我可以使用数组保存我自己的列表,但我不认为这是一个最佳解决方案,原因有两个:
socket.set('nickname', 'superman')
),因此如果我要维护自己的列表,则需要跟上这些更改。帮助?
发布于 2011-08-06 23:18:14
在Socket.IO 0.7中,您在名称空间上有一个clients
方法,该方法返回所有连接的套接字的数组。
无命名空间的API:
var clients = io.sockets.clients();
var clients = io.sockets.clients('room'); // all users from room `room`
对于命名空间
var clients = io.of('/chat').clients();
var clients = io.of('/chat').clients('room'); // all users from room `room`
希望这对将来的某人有所帮助
注意事项:本解决方案仅适用于 1.0之前的版本
更新于2020年3月6日
从1.x开始,请访问此链接:getting how many people are in a chat room in socket.io
发布于 2014-06-10 23:47:43
Socket.io 1.4
Object.keys(io.sockets.sockets);
为您提供了所有已连接的套接字。
Socket.io 1.0从socket.io 1.0开始,实际接受的答案不再有效。所以我做了一个小函数,用作临时修复:
function findClientsSocket(roomId, namespace) {
var res = []
// the default namespace is "/"
, ns = io.of(namespace ||"/");
if (ns) {
for (var id in ns.connected) {
if(roomId) {
var index = ns.connected[id].rooms.indexOf(roomId);
if(index !== -1) {
res.push(ns.connected[id]);
}
} else {
res.push(ns.connected[id]);
}
}
}
return res;
}
无命名空间的Api变为
// 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变为:
// 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');
另请参见此related question,其中我给出了一个函数,该函数返回给定房间的套接字。
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;
}
Socket.io 0.7
无命名空间的API
var clients = io.sockets.clients();
var clients = io.sockets.clients('room'); // all users from room `room`
对于命名空间
var clients = io.of('/chat').clients();
var clients = io.of('/chat').clients('room'); // all users from room `room`
注意:由于socket.io应用程序接口似乎容易崩溃,并且一些解决方案依赖于实现细节,因此可能需要自己跟踪客户端:
var clients = [];
io.sockets.on('connect', function(client) {
clients.push(client);
client.on('disconnect', function() {
clients.splice(clients.indexOf(client), 1);
});
});
发布于 2014-06-08 19:48:30
在socket.io 1.0之后,我们不能使用
io.sockets.clients();
or
io.sockets.clients('room');
更多。相反,您可以使用以下代码
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
}
https://stackoverflow.com/questions/6563885
复制相似问题