Una soluzione più elegante sarebbe quella di collegare ogni presa all'ID utente del canale, ad esempio:
io.sockets.on('connection', function (socket) {
socket.join(userID);
});
// when you want somebody to send a message to userID you can do:
io.sockets.in(userID).emit(message);
Ci sono due cose di cui devi occuparti qui:
- Assicurati che solo userID possa connettersi al suo canale, quindi verifica la sessione (leggi di più qui:http://www.danielbaulig.de/socket-ioexpress/ )
- Alla connessione aumenta il valore di userID in redis (in modo da sapere che una nuova connessione per quell'utente è in ascolto) e alla disconnessione diminuisci il valore di userID (in modo da conoscere il numero di connessioni ancora in ascolto). Se il valore è 0, emetti un messaggio alla chat in cui si afferma che l'ID utente è uscito (poiché il numero di connessioni in ascolto del canale ID utente è 0).
Quando altri utenti vorranno inviare un messaggio a userID, non hanno bisogno di connettersi al canale userID, possono inviare un messaggio alla chat
canale e passa l'ID utente come proprietà. Ad esempio:
var chat = io
.of('/chat')
.on('connection', function (socket) {
// connected to public chat
})
.on('message', function (data) {
if (data.userID && data.message) {
io.sockets.in(userID).emit('UserX: ' + data.message);
}
});