По-елегантно решение би било да накарате всеки сокет да се свързва с потребителския идентификатор на канала, например:
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);
Тук трябва да се погрижите за две неща:
- Уверете се, че само userID може да се свърже с неговия канал, като по този начин потвърдете сесията (прочетете повече тук:http://www.danielbaulig.de/socket-ioexpress/)
- При свързване увеличете стойността за userID в redis (за да знаете, че нова връзка за този потребител слуша), а при прекъсване намалете стойността на userID (така че знаете броя на връзките, които все още слушат). Ако стойността е 0, тогава изпращате съобщение до чата, в което се посочва, че userID е напуснал (тъй като броят на връзките, слушащи канала на userID, е 0).
Когато други потребители искат да изпратят съобщение до userID, те не трябва да се свързват с потребителския канал, те могат да изпратят съобщение до chat
канал и подайте userID като свойство. Например:
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);
}
});