2015-06-03 14 views
12

Zaczynam budować serwer czatu używając Socket.io z wieloma węzłami. Używa ona Socket.io-redis do łączenia wszystkich serwerów razem i rooms do przesyłania wiadomości.Socket.io: Jak liczyć klientów w pokoju z adapterem Socket.io-redis

Kiedy klient łączy się z serwerem, przyłączam klienta do pokoju.

io.on('connection', function(socket){ 
    socket.join("CLIENT_1"); 
}); 

Więc chcę uzyskać liczbę klientów podłączonych do pokoju "CLIENT_1",

io.sockets.adapter.rooms["CLIENT_1"]; 

ale tylko uzyskać połączenie z bieżącego procesu. Jak mogę uzyskać połączenie ze wszystkich procesów serwera połączonych za pomocą adaptera Redis?

I już przez to pytanie:

How to check socket is alive (connected) in socket.io with multiple nodes and socket.io-redis

ale to mi nie pomaga.

Dzięki za zaliczkę.

Odpowiedz

7

Jak to pisze:

redis adapter extends the base adapter, ale to tylko nadpisuje/dodaje następujące właściwości:

  • onmessage
  • broadcast
  • add
  • del
  • delAll

Z tym kodem twojej:

io.sockets.adapter.rooms["CLIENT_1"]; 

jesteś zapytań the rooms property. Nie zostało to przesłonięte przez adapter redis, więc w rzeczywistości pytasz o adapter bazowy, który zna tylko pokoje/klienty w bieżącym procesie.

Dlaczego adapter redis nie przesłaniał właściwości rooms? Ponieważ aby dopasować dokładny podpis wywołania powyżej, musiałby wysłać zapytanie do instancji redis, aby skonstruować obiekt zawierający wszystkie pokoje i połączenia za każdym razem, gdy właściwość jest dostępna. Niedobrze. (To znaczy, jeśli nie możesz obliczyć, jak obliczyć wartości obiektów w czasie, gdy ich wartości są sprawdzane.)

Jeśli chcesz uzyskać liczbę połączeń do sali "CLIENT_1" we wszystkich procesach w klastrze, będziesz mieć aby dodać tę funkcjonalność do the adapter itself z metody takie jak to:

/** 
    * Count the number of connections in a room. 
    * 
    * @param {String} room id 
    * @param {Function} callback (optional) 
    * @api public 
    */ 

    Redis.prototype.numClients = function(room, fn){ ... } 

którym będziesz kwerendy instancji Redis dB.

IMO, powinno to być częścią interfejsu adaptera podstawowego dla wszystkich innych adapterów do implementacji.It's a common problem.

+1

dobry pomysł. Dziękuję, spróbuję. –

+3

Batt, sprawiłeś, że działa? – Geek4IT

1

Ta metoda działa doskonale:

io.sockets.adapter.clients(["room1"], function(err, clients){ 
    console.log("total clients in room1: %d", clients.length); 
})