Solusi yang lebih elegan adalah membuat setiap soket terhubung ke ID pengguna saluran, misalnya:
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);
Ada dua hal yang perlu Anda perhatikan di sini:
- Pastikan hanya userID yang dapat terhubung ke salurannya, dengan demikian verifikasi sesi ( baca selengkapnya di sini:http://www.danielbaulig.de/socket-ioexpress/ )
- Saat koneksi meningkatkan nilai userID di redis (agar Anda tahu koneksi baru untuk pengguna yang mendengarkan) dan di disconnect menurunkan nilai userID (agar Anda tahu jumlah koneksi yang masih mendengarkan). Jika nilainya 0 maka Anda memancarkan pesan ke obrolan yang menyatakan bahwa ID pengguna telah pergi (karena jumlah koneksi yang mendengarkan saluran ID pengguna adalah 0).
Ketika pengguna lain ingin mengirim pesan ke ID pengguna, mereka tidak perlu terhubung ke saluran ID pengguna, mereka dapat mengirim pesan ke chat
saluran dan berikan ID pengguna sebagai properti. Misalnya:
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);
}
});