Bardziej eleganckim rozwiązaniem byłoby połączenie każdego gniazda z identyfikatorem użytkownika kanału, na przykład:
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);
Są dwie rzeczy, o które musisz zadbać:
- Upewnij się, że tylko ID użytkownika może połączyć się z jego kanałem, w ten sposób zweryfikuj sesję (czytaj więcej tutaj:http://www.danielbaulig.de/socket-ioexpress/ )
- Przy połączeniu zwiększ wartość userID w redis (aby wiedzieć, że nowe połączenie dla tego użytkownika nasłuchuje), a po rozłączeniu zmniejsz wartość userID (aby wiedzieć, ile połączeń wciąż nasłuchuje). Jeśli wartość wynosi 0, wtedy wysyłasz wiadomość na czacie stwierdzającą, że odszedł użytkownik o ID (ponieważ liczba połączeń nasłuchujących na kanale ID użytkownika wynosi 0).
Gdy inni użytkownicy będą chcieli wysłać wiadomość do userID, nie muszą łączyć się z kanałem userID, mogą wysłać wiadomość na chat
kanał i przekaż identyfikator użytkownika jako właściwość. Na przykład:
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);
}
});