首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Socket.IO -如何获取已连接套接字/客户端的列表?

Socket.IO -如何获取已连接套接字/客户端的列表?
EN

Stack Overflow用户
提问于 2011-07-03 23:58:06
回答 34查看 280.7K关注 0票数 185

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

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

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

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

帮助?

EN

回答 34

Stack Overflow用户

回答已采纳

发布于 2011-08-06 23:18:14

在Socket.IO 0.7中,您在名称空间上有一个clients方法,该方法返回所有连接的套接字的数组。

无命名空间的API:

代码语言:javascript
复制
var clients = io.sockets.clients();
var clients = io.sockets.clients('room'); // all users from room `room`

对于命名空间

代码语言:javascript
复制
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

票数 186
EN

Stack Overflow用户

发布于 2014-06-10 23:47:43

Socket.io 1.4

Object.keys(io.sockets.sockets);为您提供了所有已连接的套接字。

Socket.io 1.0从socket.io 1.0开始,实际接受的答案不再有效。所以我做了一个小函数,用作临时修复:

代码语言:javascript
复制
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变为

代码语言:javascript
复制
// 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变为:

代码语言:javascript
复制
// 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,其中我给出了一个函数,该函数返回给定房间的套接字。

代码语言:javascript
复制
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

代码语言:javascript
复制
var clients = io.sockets.clients();
var clients = io.sockets.clients('room'); // all users from room `room`

对于命名空间

代码语言:javascript
复制
var clients = io.of('/chat').clients();
var clients = io.of('/chat').clients('room'); // all users from room `room`

注意:由于socket.io应用程序接口似乎容易崩溃,并且一些解决方案依赖于实现细节,因此可能需要自己跟踪客户端:

代码语言:javascript
复制
var clients = [];

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

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

Stack Overflow用户

发布于 2014-06-08 19:48:30

在socket.io 1.0之后,我们不能使用

代码语言:javascript
复制
io.sockets.clients(); 
or
io.sockets.clients('room'); 

更多。相反,您可以使用以下代码

代码语言:javascript
复制
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
}
票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6563885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档