IO-如何获得连接的套接字/客户端列表?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我正在尝试获取当前连接的所有套接字/客户端的列表。

io.sockets 不幸的是不会返回数组。

我知道我可以使用数组保留自己的列表,但不要认为这是最佳解决方案,原因有二:

  1. 冗余。Socket.IO已经保存了这个列表的副本。
  2. Socket.IO提供了为客户端设置任意字段值的方法(例如:),socket.set('nickname', 'superman')所以如果我要维护我自己的列表,我需要跟上这些更改。
提问于
用户回答回答于

在Socket.IO0.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之前的版本

用户回答回答于

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');
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 API似乎很容易中断,并且某些解决方案依赖于实现细节,因此可能需要自己跟踪客户端:

var clients = [];

io.sockets.on('connect', function(client) {
    clients.push(client); 

    client.on('disconnect', function() {
        clients.splice(clients.indexOf(client), 1);
    });
});

扫码关注云+社区