Как много людей в чате в 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});
    });

Мне хотелось узнать, как я могу узнать, сколько людей подключено к определенному чату... например 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>");
            });
        });
}

Я нашел это, но он дает undefined:

count = io.rooms[Room].length;

Ответ 1

Если вы используете версию < 1,

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

Ответ 2

Для версий socket.io >= 1.0:

Обратите внимание, что комнаты стали актуальными типами с свойством .length в 1.4, поэтому теперь метод 1.4.x должен быть стабильным.

Чтобы подсчитать всех клиентов, подключенных к '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;

Предполагается, что вы работаете с адаптером комнаты по умолчанию на одном node (в отличие от cluster). Вещи более сложные, если вы находитесь в кластере.


Другие связанные примеры:

  • Подсчитайте всех клиентов, подключенных к серверу:

    var srvSockets = io.sockets.sockets;
    Object.keys(srvSockets).length;
    
  • Подсчитайте всех клиентов, подключенных к пространству имен '/chat':

    var nspSockets = io.of('/chat').sockets;
    Object.keys(nspSockets).length
    

Ответ 3

Для socket.io 1.4.6 то, что сработало для меня, указывает пространство имен в дополнение к комнате. При использовании пространства имен по умолчанию вы можете просто указать его как ['/']. Например, чтобы получить количество клиентов, подключенных к комнате "кухня" в пространстве имен по умолчанию (nsps), вы должны написать:

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

Heads up: если никто не присоединился к комнате, он еще не создан, поэтому io.nsps['/'].adapter.rooms['kitchen'] вернет undefined. Если вы попытаетесь вызвать .length на кухне undefined, ваше приложение выйдет из строя.

Ответ 4

В версии 1.4.5

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

Ответ 5

Я использую 1.4.6, и это сделало трюк:

Object.keys(io.sockets.connected).length

Ответ 6

Я хотел получить список пользователей в комнате. Это оказалось моим решением.

Я добавил свойство username в свой сокет, но для полноты я изменил его на "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

Ответ 7

Для socket.io v2.0.3, я закончил работать с сервером redis и использовал плагин socket.io-redis. Затем вы можете сделать:

io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => {
  console.log(clients); // an array containing socket ids in 'room1' and/or 'room2'
});

код от https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray-fnfunction

kevzettler указал мне на socket.io-redis


Другой ответ для socket.io v2.0.3 от The Lazy Coder не работал у меня, он дал мне список всех подключенных клиентов, независимо от комнаты.

Ответ 8

поместите это в функцию, и это даст вам защиту от сбоев, чтобы предотвратить сбой:

var roomCount = io.nsps['/'].adapter.rooms[roomName];
if (!roomCount) return null;
return roomCount.length;