4

我刚开始玩 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 ]

我做错了什么?

PS这里是如何获得房间里的客户数量:

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

4

1 回答 1

5

发生这种情况是因为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;

来自 MDN

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

这正是我们所需要的。

于 2014-06-21T08:26:27.143 回答