Een elegantere oplossing zou zijn om elke socket te verbinden met de kanaalgebruikers-ID, bijvoorbeeld:
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);
Er zijn twee dingen die u hier moet regelen:
- Zorg ervoor dat alleen gebruikers-ID verbinding kan maken met zijn kanaal, dus verifieer de sessie (lees hier meer:http://www.danielbaulig.de/socket-ioexpress/ )
- Verhoog bij verbinding de waarde voor userID in redis (zodat u weet dat een nieuwe verbinding voor die gebruiker luistert) en verlaag bij verbreken de waarde voor userID (zodat u weet hoeveel verbindingen nog luisteren). Als de waarde 0 is, stuur je een bericht naar de chat waarin staat dat userID is vertrokken (aangezien het aantal connecties dat naar het userID-kanaal luistert 0 is).
Wanneer andere gebruikers een bericht naar userID willen sturen, hoeven ze geen verbinding te maken met het userID-kanaal, ze kunnen een bericht sturen naar de chat
kanaal en geef userID door als een eigenschap. Bijvoorbeeld:
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);
}
});