socket io v1 中房间内的客户端数量

Posted

技术标签:

【中文标题】socket io v1 中房间内的客户端数量【英文标题】:Number of clients in the room in socket io v1 【发布时间】:2014-08-11 22:15:07 【问题描述】:

我刚开始玩 socket.io 并尝试制作一些超级简单的东西,比如人们连接到房间。

我希望这会给我房间里的客户数量

io.sockets.on('connection', function (socket)
    socket.on('create or join', function (channel) 
        var numClients = io.sockets.clients(channel).length;
        ...
   
)

但它返回一个错误:Object #<Namespace> has no method 'clients',因为在 V.1 中发生了一些变化。经过一些搜索后,我用另一个回调替换了回调:

    var clients = io.sockets.adapter.rooms[channel];
    var numClients = 0;
    if (typeof clients !== 'undefined')
        numClients = clients.length;
    

    p(numClients);   // p is just a wrapper on console.log()
    p(clients);
    socket.join(channel);
    socket.emit('created', channel);

但是无论我连接多少次,我的客户端数都是 0:

0
undefined
0
[ hSxLuOqrm5bX4UxmAAAA: true ]
0
[ hSxLuOqrm5bX4UxmAAAA: true, '2bjYS0lrUFySPM1OAAAB': true ]

我做错了什么?

P.S.这里是如何获取房间中的客户数量:

var numClients = (typeof clients !== 'undefined') ? Object.keys(clients).length : 0;

【问题讨论】:

【参考方案1】:

这是因为clients 数组存储套接字不是使用索引键,而是使用字符串键(如对象)。

为了证明这一点,请查看以下代码:

var clients = [];
clients.somekey1 = true;
clients.somekey2 = true;

console.log(clients.length);
console.log(clients);

这是输出:

0
[ somekey1: true, somekey2: true ]

这个数组的实际长度是0,尽管里面有属性。所以你应该把clients数组看作一个对象,因此可以用下面的代码行来计算这个“对象”中的客户端数量:

var numClients = Object.keys(clients).length;

From the MDN:

Object.keys() 方法返回给定对象自己的可枚举属性的数组,其顺序与 for...in 循环提供的顺序相同(区别在于 for-in 循环枚举原型链中的属性)。

而这正是我们所需要的。

【讨论】:

这很好用,但是是打开的会话数。如果客户端有 3 个浏览器选项卡,则 numClients 将是 3...如何获取房间内连接的真实用户数?

以上是关于socket io v1 中房间内的客户端数量的主要内容,如果未能解决你的问题,请参考以下文章

如何获取房间中的socket.io客户端数量?

如何在 socket.io 1.0 中获取房间的客户列表

socket.io 从两个房间加入客户端

NodeJs Socket.io 房间

Socket IO Rooms:获取特定房间的客户端列表

如何在socket.io中发射到房间? [复制]