より洗練された解決策は、各ソケットをチャネル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);
ここで注意する必要があるのは2つあります:
- 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);
}
});