Как обрабатывать пары пользователей и сокетов с помощью node.js + redis - PullRequest
1 голос
/ 20 декабря 2011

Прямо в точку: Я использую node.js, socket.io и redis для системы частного чата.

При подключении пользователь передает свой идентификатор сайта (userID) на сервер node.js. У него может быть несколько соединений, поэтому мне нужно как-то соединить socketID (каждого соединения) и userID. Я думал об использовании Redis для хранения пар userID-> sessionID. Однако, когда пользователь отключается, мне нужно удалить эту пару из redis ... но у меня есть только socketID, а не userID, поэтому я не могу выбрать по этой клавише ..

Теперь, я подхожу к этому неправильному пути или я должен хранить пары userID-> socketID и socketID-> userID? Может быть, кто-то может предложить более элегантное решение?

1 Ответ

3 голосов
/ 20 декабря 2011

Более элегантным решением было бы подключить каждый сокет к идентификатору пользователя канала, например:

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);

Здесь необходимо позаботиться о двух вещах:

  1. Убедитесь, что только userID может подключиться к его каналу, тем самым проверьте сеанс (подробнее здесь: http://www.danielbaulig.de/socket-ioexpress/)
  2. При подключении увеличьте значение 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);
    }
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...