2011-12-19 34 views
1

直接點: 我使用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對?也許有人會提供更優雅的解決方案?

回答

3

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