En mer elegant lösning skulle vara att få varje uttag att ansluta till kanalens användar-ID, till exempel:
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);
Det finns två saker du måste ta hand om här:
- Se till att endast användar-ID kan ansluta till hans kanal, så verifiera sessionen (läs mer här:http://www.danielbaulig.de/socket-ioexpress/ )
- Vid anslutning öka värdet för användar-ID i redis (så att du vet att en ny anslutning för den användaren lyssnar) och vid frånkoppling minska användar-ID-värdet (så att du vet antalet anslutningar som fortfarande lyssnar). Om värdet är 0 skickar du ett meddelande till chatten om att användar-ID har lämnats (eftersom antalet anslutningar som lyssnar på användar-ID-kanalen är 0).
När andra användare vill skicka ett meddelande till användar-ID, behöver de inte ansluta till användar-ID-kanalen, de kan skicka ett meddelande till chat
kanal och skicka användar-ID som en egenskap. Till exempel:
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);
}
});