2012-02-19 2 views
27

у меня есть этот код прямо сейчас, что устанавливает ник и номер:получать сколько людей в чате в 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}); 
    }); 

Я хотел знать, как я мог бы получить, сколько людей подключены к специфический Chatroom ... как 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; 
+0

Некоторые больше информации было бы хорошо, это соединение, сделанное на обычный сервер IRC или на сервере программы пользовательского чата? –

+0

чат-серверная программа – re1man

+0

+1. Кажется, это должно быть проще, чем есть. – kdbanman

ответ

21

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

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

+5

просто напоминание, это вернет массив сокетов в комнате. Поэтому, чтобы получить количество людей в комнате, обязательно добавьте .length к вышеуказанному коду – levi

+0

Только то, что я искал. Благодаря! –

+7

'io.sockets' возвращает по умолчанию' пространство имен' (''/''). Что касается socket.io 1.0.x, 'Namespaces' не имеют метода' .clients() '. Я просто протестировал его, 'io.sockets.clients === undefined'. Этот ответ больше не будет работать. – kdbanman

69

Для 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; 

Предполагается, что вы работаете с default room adapter на одном узле (в отличие от cluster). Вещи more complicated, если вы находитесь в кластере.


Другие соответствующие примеры:

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

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

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

В версии 1.4.5

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

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

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

Этот метод подсчитывается только в одном узле. – tuananh

+0

Это будет считать всех подключенных клиентов во всех комнатах. – talent

6

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

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

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

+0

Отлично, спасибо человеку! – furcicm

0

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

Я добавил свойство 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

0

Для 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 не работал для меня, он дал мне список всех подключенных клиентов, независимо от комнаты.

-1

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

var roomCount = io.nsps['/'].adapter.rooms[roomName]; 
if (!roomCount) return null; 
return roomCount.length; 
Смежные вопросы