Более элегантным решением было бы подключить каждый сокет к идентификатору пользователя канала, например:
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, им не нужно подключаться к каналу 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);
}
});