如何使用node.js + redis处理用户和套接字对

问题描述:

直接点: 我使用node.js,socket.io和redis作为私人聊天系统。如何使用node.js + redis处理用户和套接字对

On connect用户将他的网站id(userID)传递给node.js服务器。他可能有多个连接,所以我必须以某种方式配对每个连接的socketID和用户ID。我一直在考虑使用redis来存储userID-> sessionID对。但是,当用户断开连接时,我需要从redis删除该对..但我只有socketID不是用户ID,所以我不能通过该键选择..

现在,我接近这个错误的方式或应该存储用户ID->套接字ID和套接字ID->用户ID对?也许有人会提供更优雅的解决方案?

一个更优雅的解决方案是让每个插座连接通道用户ID,例如:

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. 确保只有用户ID可以连接到他的频道,从而验证会话(在这里阅读更多:http://www.danielbaulig.de/socket-ioexpress/
  2. 在连接上增加redis中userID的值(以便您知道该用户的新连接正在侦听)断开连接时减少用户ID值(以便知道仍在监听的连接数)。如果值为0,则向聊天室发送消息,指出该用户ID已离开(因为侦听用户ID通道的连接数为0)。

当其他用户将要发送消息到用户ID,他们并不需要连接到用户ID通道,他们可以将消息发送到chat通道,并通过用户ID作为一个属性。例如:

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 2011-12-19 20:46:19

+0

更新了我的留言,看看底部。 – alessioalex 2011-12-19 20:53:16