一個更優雅的解決方案是讓每個插座連接通道用戶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