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 中房间内的客户端数量的主要内容,如果未能解决你的问题,请参考以下文章