套接字io v1中房间内的客户端数量

时间:2014-06-21 07:27:13

标签: socket.io socket.io-1.0

我刚刚开始玩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 个答案:

答案 0 :(得分:5)

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

为了演示这一点,请查看以下代码:

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

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

这是输出:

0
[ somekey1: true, somekey2: true ]

此数组的实际长度为0,尽管其中包含属性。因此,您应该将clients数组视为一个对象,从而计算此对象中的客户端数量&#34;可以使用以下代码行执行:

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

From the MDN

  

Object.keys() 方法返回给定对象自身可枚举属性的数组,其顺序与for...in循环提供的顺序相同(差异)因为for-in循环也枚举了原型链中的属性。

这正是我们所需要的。