Количество подключенных пользователей Socket.io
Наконец-то я получил socket.io, чтобы нормально работать, но я столкнулся с какой-то странной проблемой.
Я не уверен, что это лучший способ, но я использую:
io.sockets.clients().length
Это возвращает количество клиентов, подключенных к моему серверу. Проблема заключается в том, что после нескольких подключений и отключений пользователей число начинает оставаться выше, чем должно быть.
Например, если я подключусь и спрошу своих друзей, число будет правильным. Но когда мы начинаем отключать и снова соединяем, число не уменьшается.
Я запускаю сервер node.js и sockets.io на сервере vmware ubuntu.
Кто-нибудь знает, почему это или есть лучший способ узнать, сколько людей подключено к серверу?
Ответы
Ответ 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} вместо макета