在 socket.io 中获取聊天室中有多少人

IT技术 javascript node.js socket.io
2021-02-06 13:14:20

我现在有这个设置昵称和房间的代码:

io.sockets.on('connection', function(client){
    var Room = "";
    client.on("setNickAndRoom", function(nick, fn){
        client.join(nick.room);
        Room = nick.room;
        client.broadcast.to(Room).emit('count', "Connected:" + " " + count);
        fn({msg :"Connected:" + " " + count});
    });

我想知道如何让多少人连接到特定的聊天室......比如 Room.length

客户端 :

function Chat(){
    this.socket = null;
    this.Nickname = "";
    this.Room = "";
    var synched = $('#syncUp');
    this.Connect = function(nick, room){ 
        socket =  io.connect('http://vybeing.com:8080');    
        Nickname = nick;
        Room = room;
        //conectarse
        socket.on('connect',function (data) {
            socket.emit('setNickAndRoom', {nick: nick, room: room}, function(response){
                $("#connection").html("<p>" + response.msg + "</p>");
            });
        });
}

我找到了这个,但它给出了未定义的:

count = io.rooms[Room].length;
6个回答

对于 socket.io 版本 >= 1.0:

请注意,房间.length在 1.4 中成为具有属性的实际类型,因此 1.4.x 方法从现在开始应该是稳定的。当然,除非对该类型的 API 进行重大更改。

要计算连接到的所有客户端'my_room'

1.4+:

var room = io.sockets.adapter.rooms['my_room'];
room.length;

1.3.x:

var room = io.sockets.adapter.rooms['my_room'];
Object.keys(room).length;

1.0.x 到 1.2.x:

var room = io.adapter.rooms['my_room'];
Object.keys(room).length;

这是假设您在单个节点(而不是cluster上使用默认房间适配器运行如果你在一个集群中,事情会更复杂


其他相关示例:

  • 计算连接到服务器的所有客户端:

    var srvSockets = io.sockets.sockets;
    Object.keys(srvSockets).length;
    
  • 计算连接到命名空间的所有客户端'/chat'

    var nspSockets = io.of('/chat').sockets;
    Object.keys(nspSockets).length
    
@Sachin 请发布一个单独的问题,其中包含复制您的问题的代码。
2021-04-03 13:14:20
这应该是批准的答案......真正的答案
2021-04-05 13:14:20
获取我使用的所有已连接客户端的 ID Array.from(io.sockets.sockets.keys(),让客户端自己使用Array.from(io.sockets.sockets.values()
2021-04-08 13:14:20

如果您使用的版本 < 1,

var clients = io.sockets.clients(nick.room); // all users from room

这不是真的。是会话数,而不是用户数...如果同一用户有 3 个浏览器选项卡,则您的案例中的客户端数量会增加 3 个用户。如何获取房间内的实际连接用户数?:)
2021-03-16 13:14:20
正是我要找的。谢谢!
2021-03-18 13:14:20
@AralRoca 出于所有意图和目的,会话数是房间中的实际用户数。您无法区分同一 IP 上的多个会话之间的区别,就您所知,这可能是 3 个选项卡,也可能是工作网络上的三台不同的计算机。
2021-03-26 13:14:20
io.sockets返回默认值Namespace( '/')。从 socket.io 1.0.x 开始,Namespaces没有.clients()方法。我刚刚测试了一下,io.sockets.clients === undefined这个答案将不再适用。
2021-04-02 13:14:20
提醒一下,这将返回房间中的一组套接字。所以要得到房间里的人数,一定要在上面的代码后面加上.length
2021-04-12 13:14:20

对于 socket.io 1.4.6,对我有用的是指定除了房间之外的命名空间。使用默认命名空间时,您只需将其指定为['/']. 例如,要获取连接到默认命名空间 (nsps) 中房间“厨房”的客户端数量,您可以编写:

var io = require('socket.io')();
io.nsps['/'].adapter.rooms['kitchen'].length

注意:如果没有人加入房间,则它尚未创建,因此io.nsps['/'].adapter.rooms['kitchen']将返回undefined如果您尝试调用.length未定义的厨房,您的应用程序将崩溃。

在 1.4.5 版本中

var clientNumber = io.sockets.adapter.rooms[room].length;

我想获取房间中的用户列表。这最终成为我的解决方案。

我向我的套接字添加了一个用户名属性,但为了完整起见,我将其更改为“id”,即套接字的 id。

var sockets = io.in("room_name")
Object.keys(sockets.sockets).forEach((item) => {
  console.log("TODO: Item:", sockets.sockets[item].id)            
})

Socket.io v2.0.3

无论房间如何,我都在这里获得所有连接的sockets。
2021-04-08 13:14:20