2015-06-03 13 views
12

Inizio a creare il server di chat utilizzando Socket.io con più nodi. Utilizza Socket.io-redis per connettere tutti i server insieme e rooms per la messaggistica.Socket.io: Come contare i client in una stanza con l'adattatore Socket.io-redis

Quando un client si connette al server, unisco il client a qualche stanza.

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

quindi voglio ottenere il numero di client connessi a camera "CLIENT_1",

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

ma ho solo collegamento dal processo corrente. Come posso ottenere la connessione da tutti i processi server connessi tramite l'adattatore redis?

Ho passato con questa domanda:

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

ma non mi ha aiutato.

Grazie per l'anticipo.

risposta

7

partire da questa scrittura:

Il redis adapter extends the base adapter, ma prevale solo/aggiunge le seguenti proprietà:

  • onmessage
  • broadcast
  • add
  • del
  • delAll

Con questo codice di tuo:

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

si sta interrogando the rooms property. Questo non è stato sovrascritto dall'adattatore redis, quindi in realtà stai interrogando l'adattatore di base, che conosce solo stanze/client nel processo corrente.

Perché l'adattatore redis ha ignorato la proprietà rooms? Perché per abbinare la firma della chiamata esatta sopra, dovrebbe interrogare l'istanza di redis per costruire un oggetto contenente tutte le stanze e le connessioni ogni volta che si accede alla proprietà. Non bene. (A meno che non sia possibile calcolare come calcolare i valori dell'oggetto nel momento in cui vengono interrogati i loro valori.)

Se si desidera ottenere il numero di connessioni alla sala "CLIENT_1" attraverso tutti i processi nel cluster, sarà necessario per aggiungere tale funzionalità a the adapter itself con un metodo come questo:

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

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

in cui si esegue una query l'istanza Redis db.

IMO, questo dovrebbe essere parte dell'interfaccia dell'adattatore di base per tutti gli altri adattatori da implementare.It's a common problem.

+1

Buona idea. Grazie, ci proverò. –

+3

Batt, hai fatto funzionare? – Geek4IT

1

Questo metodo funziona perfettamente:

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