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

re1*_*man 36 javascript node.js socket.io

我现在有这个代码设置缺口和房间:

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});
    });
Run Code Online (Sandbox Code Playgroud)

我想知道我怎么能得到有多少人连接到一个特定的聊天室......比如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>");
            });
        });
}
Run Code Online (Sandbox Code Playgroud)

我找到了这个,但它给出了undefined:

count = io.rooms[Room].length;
Run Code Online (Sandbox Code Playgroud)

kdb*_*man 89

对于socket.io版本> = 1.0:

请注意,房间变为具有.length1.4属性的实际类型,因此1.4.x方法从现在开始应该是稳定的.

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

1.4+:

var room = io.sockets.adapter.rooms['my_room'];
room.length;
Run Code Online (Sandbox Code Playgroud)

1.3.x的:

var room = io.sockets.adapter.rooms['my_room'];
Object.keys(room).length;
Run Code Online (Sandbox Code Playgroud)

1.0.x到1.2.x:

var room = io.adapter.rooms['my_room'];
Object.keys(room).length;
Run Code Online (Sandbox Code Playgroud)

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


其他相关例子:


Sơn*_*yễn 27

如果您使用的是版本<1,

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

  • `io.sockets`返回默认的`Namespace`(`'/'`).从socket.io 1.0.x开始,`Namespaces`没有`.clients()`方法.我刚试过它,`io.sockets.clients === undefined`.这个答案将不再适用. (9认同)
  • 只是提醒一下,这将返回房间中的一组插座.因此,为了获得房间里的人数,请务必将.length附加到上面的代码中 (6认同)

Iro*_*ney 7

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

var io = require('socket.io')();
io.nsps['/'].adapter.rooms['kitchen'].length
Run Code Online (Sandbox Code Playgroud)

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


小智 5

在1.4.5版中

var clientNumber = io.sockets.adapter.rooms[room].length;
Run Code Online (Sandbox Code Playgroud)


The*_*der 5

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

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

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

Socket.io v2.0.3