直截了当:我正在使用node.js,socket.io和Redis进行私人聊天系统。
在连接时,用户将其网站ID(userID)传递给node.js服务器。他可能有多个连接,所以我必须以某种方式将(每个连接的)socketID和userID配对。我在考虑使用redis存储userID-> sessionID对。但是,当用户断开连接时,我需要从redis中删除该对。但是我只有socketID而没有userID,因此无法通过该键进行选择。
现在,我是用错误的方式来处理还是应该同时存储userID-> socketID和socketID-> userID对?也许有人可以提供更优雅的解决方案?
一个更优雅的解决方案是使每个套接字都连接到通道userID,例如:
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发送消息时,他们不需要连接到userID通道,则可以向该chat通道发送消息并将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); } });