Eine elegantere Lösung wäre, jeden Socket mit der Benutzer-ID des Kanals verbinden zu lassen, zum Beispiel:
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);
Hier müssen Sie zwei Dinge beachten:
- Stellen Sie sicher, dass nur userID sich mit seinem Kanal verbinden kann, also die Sitzung verifizieren kann (lesen Sie hier mehr:http://www.danielbaulig.de/socket-ioexpress/)
- Erhöhen Sie bei der Verbindung den Wert für userID in redis (damit Sie wissen, dass eine neue Verbindung für diesen Benutzer zuhört) und beim Trennen verringern Sie den Wert für userID (damit Sie wissen, wie viele Verbindungen noch zuhören). Wenn der Wert 0 ist, senden Sie eine Nachricht an den Chat, die besagt, dass die Benutzer-ID gegangen ist (da die Anzahl der Verbindungen, die den Benutzer-ID-Kanal abhören, 0 ist).
Wenn andere Benutzer eine Nachricht an userID senden möchten, müssen sie sich nicht mit dem userID-Kanal verbinden, sie können eine Nachricht an den chat
senden Kanal und übergeben Sie die Benutzer-ID als Eigenschaft. Zum Beispiel:
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);
}
});