一个更优雅的解决方案是使每个套接字都连接到通道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可以连接到他的频道,从而验证会话(在此处了解更多信息:http : //www.danielbaulig.de/socket-ioexpress/)
- 在连接时,增加redis中的userID值(以便您知道该用户正在监听的新连接),而在断开连接时,减小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); } });


