En mere elegant løsning ville være at få hver socket til at forbinde til kanalens bruger-ID, for eksempel:
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);
Der er to ting, du skal passe på her:
- Sørg for, at kun bruger-ID kan oprette forbindelse til hans kanal, og bekræft dermed sessionen (læs mere her:http://www.danielbaulig.de/socket-ioexpress/ )
- Ved forbindelse, øg værdien for bruger-ID i redis (så du ved, at en ny forbindelse for den bruger lytter) og ved afbrydelse reduceres bruger-id-værdien (så du ved, hvor mange forbindelser der stadig lytter). Hvis værdien er 0, udsender du en besked til chatten om, at bruger-ID er forladt (da antallet af forbindelser, der lytter til bruger-ID-kanalen, er 0).
Når andre brugere ønsker at sende en besked til bruger-ID, behøver de ikke at oprette forbindelse til bruger-ID-kanalen, de kan sende en besked til chat
kanal og videregive bruger-id som en egenskab. For eksempel:
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);
}
});