Подтвердить что ты не робот

Количество подключенных пользователей Socket.io

Наконец-то я получил socket.io, чтобы нормально работать, но я столкнулся с какой-то странной проблемой.

Я не уверен, что это лучший способ, но я использую:

io.sockets.clients().length

Это возвращает количество клиентов, подключенных к моему серверу. Проблема заключается в том, что после нескольких подключений и отключений пользователей число начинает оставаться выше, чем должно быть.

Например, если я подключусь и спрошу своих друзей, число будет правильным. Но когда мы начинаем отключать и снова соединяем, число не уменьшается.

Я запускаю сервер node.js и sockets.io на сервере vmware ubuntu.

Кто-нибудь знает, почему это или есть лучший способ узнать, сколько людей подключено к серверу?

4b9b3361

Ответ 1

Для этого существует проблема github. Проблема в том, что всякий раз, когда кто-то отключает socket.io, он не удаляет (сращивание) из массива, а просто устанавливает значение "null", поэтому на самом деле у вас много нулевых значений в вашем массиве, что делает ваши клиенты ().length больше, чем у вас в действительности.

Вам нужно управлять другим способом для подсчета ваших клиентов, например. что-то вроде

socket.on('connect', function() { connectCounter++; });
socket.on('disconnect', function() { connectCounter--; });

Это шум ума, почему люди, стоящие за socket.io, оставили такие вещи, но лучше объяснить в проблеме github, которую я опубликовал как ссылку!

Ответ 2

На всякий случай кто-то попадает на эту страницу при использовании socket.io версии 1.0

Вы можете подсчитать количество подключенных клиентов с

socketIO.engine.clientsCount

Требуется ответ, и выше не было работы для новой версии socket.io

Ответ 3

Я нашел способ разобраться в версии 1.3.7. Существует три метода:

  • io.engine.clientsCount
  • io.sockets.sockets.length
  • Object.keys(io.sockets.connected).length

Надеюсь, это поможет кому-то с той же проблемой.:)

Ответ 4

Я использую socket.io 0.9.10 и следующий код для определения количества сокетов:

var socketIO =  require('socket.io').listen( .....
var numberOfSockets = Object.keys(socketIO.connected).length;

Не уверен, насколько точно это число реагирует на различные кромки, но теперь это кажется точным: каждое соединение с браузером увеличивает число, каждый браузер закрывает его.

Ответ 5

Также обратите внимание:

io.sockets.manager.connected

Это чистый список пар значений ключа (идентификатор сокета и состояние соединения?)

Ответ 6

Зачем использовать (неявную глобальную) переменную, когда вы всегда можете фильтровать массив, возвращаемый вызовом метода clients().

function filterNullValues (i) {
  return (i!=null);
}
io.sockets.clients().filter(filterNullValues).length;

Ответ 7

В настоящее время я использую Socket.io v1.3.6 и обнаружил, что это работает. Он дает точное число, когда пользователи подключаются и когда они разъединяются:

io.sockets.sockets.length

Так же:

var io = require('socket.io').listen(server);
io.on('connection', function(socket) {
  console.log(io.sockets.sockets.length);
  socket.on('disconnect', function() {
    console.log(io.sockets.sockets.length);
  });
});

Ответ 8

Я не вижу упоминания о многоядерных приложениях, поэтому я просто добавлю, что, поскольку я использую несколько ядер (кластеров), я не смог последовательно получить нужное количество сокетов на стороне клиента, поэтому Я закончил тем, что сохранил их на свой экземпляр монго, и он довольно последователен и точен. При таком подходе я могу просматривать мои сокетные соединения в стиле через браузер:).

Схема Mongoose:

var socketSchema = mongoose.Schema({
        socket : Number
});

Использование:

//reset to 0 when the app starts ( just in case )
SocketModel.find({ "socket" : 1 } , function(err, deadSockets ) {
    if (err){
        console.log( err );
    }
    else{
        for( var i = 0 ; i < deadSockets.length ; i++ ){
            deadSockets[i].remove();                
        }
    }
});

io.on('connection', function( socket ) {
    //I found I needed to make sure I had a socket object to get proper counts consistantly
    if( socket ){
        var socketEntry = new SocketModel({ "socket" : 1 });
        socketEntry.save( function(err ){
            if (err){
                console.log( err );
            }
            else{

            }
        });
    }
    //On Disconnect
    socket.on('disconnect', function() {
        SocketModel.findOne({ "socket" : 1} , function(err, deadSocket ) {
            if (err){
                console.log( err );
            }
            else{
                deadSocket.remove();
            }
        }); 
    });
});

Сколько у меня есть?

SocketModel.count({ "socket" : 1 } , function(err, count ) {
    if (err){
        console.log(err);
    }
    else{
        var term = "sockets";
        if( count == 1 ) term = "socket";
        console.log("Current Load: " , count , term );
    }
}); 

ПРИМЕЧАНИЕ * Мне не нравятся пустые объекты запроса ({}), поэтому я просто использовал { "socket": 1} вместо макета