Một giải pháp thanh lịch hơn sẽ là làm cho mỗi ổ cắm kết nối với userID kênh, ví dụ:
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);
Có hai điều bạn cần quan tâm ở đây:
- Đảm bảo rằng chỉ userID mới có thể kết nối với kênh của anh ấy, do đó xác minh phiên (đọc thêm tại đây:http://www.danielbaulig.de/socket-ioexpress/)
- Khi kết nối, tăng giá trị cho userID trong redis (để bạn biết một kết nối mới cho người dùng đó đang nghe) và khi ngắt kết nối, giảm giá trị userID (để bạn biết số lượng kết nối vẫn đang nghe). Nếu giá trị là 0 thì bạn sẽ gửi một thông báo tới cuộc trò chuyện cho biết rằng userID đã rời khỏi (vì số lượng kết nối đang nghe kênh userID là 0).
Khi người dùng khác muốn gửi tin nhắn tới userID, họ không cần kết nối với kênh userID, họ có thể gửi tin nhắn đến chat
kênh và chuyển userID làm thuộc tính. Ví dụ:
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);
}
});