如何使用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);
有两件事情你需要在这里照顾:
- 确保只有用户ID可以连接到他的频道,从而验证会话(在这里阅读更多:http://www.danielbaulig.de/socket-ioexpress/)
- 在连接上增加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);
}
});
如果多个用户想要与同一用户交谈,该怎么办?他们将全部加入同一频道。 – Audrius 2011-12-19 20:46:19
更新了我的留言,看看底部。 – alessioalex 2011-12-19 20:53:16