2011-12-19 2 views
1

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

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

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

ответ

3

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

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. Убедитесь что только идентификатор пользователя может подключиться к его каналу, таким образом, проверить сеанс (подробнее здесь: http://www.danielbaulig.de/socket-ioexpress/)
  2. При подключении увеличивайте значение для userID в redis (чтобы вы знали, что новое соединение для этого пользователя прослушивает) d on disconnect уменьшает значение userID (чтобы вы знали, сколько подключений все еще прослушивается). Если значение равно 0, вы отправляете сообщение в чат с указанием того, что идентификатор пользователя оставлен (так как количество подключений, прослушивающих канал userID, равно 0).

Когда другие пользователи хотят, чтобы отправить сообщение на идентификатор пользователь, они не должны подключаться к каналу USERID, они могут послать сообщение chat канала и передать идентификатор_пользователь как свойство. Например:

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); 
    } 
    }); 
+0

Что делать, если несколько пользователей хотят поговорить с одним и тем же пользователем? Все они присоединятся к одному каналу. – Audrius

+0

Обновлено мое сообщение, посмотрите на дно. – alessioalex