【问题标题】:node.js socket.io room total of usersnode.js socket.io 房间用户总数
【发布时间】:2014-07-29 07:37:36
【问题描述】:

我正在尝试计算特定房间中的用户总数并将其广播给该房间中的所有人。

这是我所拥有的,但出现错误:

var clients = io.sockets.clients(cc.lowerCase(data.roomname)).length;
         io.sockets.in(cc.lowerCase(data.roomname)).emit('updatetotal', { total: clients });

错误:

TypeError: Object #<Namespace> has no method 'clients'

谢谢。

【问题讨论】:

  • 你能显示更多代码吗?这不足以调试问题

标签: node.js socket.io


【解决方案1】:

自从 socket.io 1.0 以来,它的 API 发生了重大变化,因此旧代码可能无法正常工作。

要获取房间中的客户数量,您可以使用此功能:

var getUsersInRoomNumber = function(roomName, namespace) {
    if (!namespace) namespace = '/';
    var room = io.nsps[namespace].adapter.rooms[roomName];
    if (!room) return null;
    var num = 0;
    for (var i in room) num++;
    return num;
}

或更简洁:

var getUsersInRoomNumber = function(roomName, namespace) {
    if (!namespace) namespace = '/';
    var room = io.nsps[namespace].adapter.rooms[roomName];
    if (!room) return null;
    return Object.keys(room).length;
}

这个函数需要两个参数:

  • roomName
  • namespace(可选)默认 = '/'

要向该房间的用户发送消息,只能使用.to 方法:

io.to(yourRoomName).emit('updatetotal', { total: getUsersInRoomNumber(yourRoomName) });

【讨论】:

  • 但问题是用户数量,而不是套接字(会话)的数量。如果同一用户有 3 或 4 个浏览器选项卡,则此用户数将是 3 或 4……但真正连接的用户只有 1。
【解决方案2】:

获取房间内的总用户数

io.sockets.adapter.rooms.get(roomName).size

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 2015-05-29
    • 2012-12-08
    • 2013-10-10
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2021-12-21
    • 2014-02-23
    相关资源
    最近更新 更多