Saya bekerja dengan socket.io dan node.js dan sampai sekarang sepertinya cukup bagus, tetapi saya tidak tahu bagaimana mengirim pesan dari server ke klien tertentu, sesuatu seperti ini:
client.send(message, receiverSessionId)
Tetapi baik metode .send()
maupun .broadcast()
metode tampaknya tidak memenuhi kebutuhan saya.
Apa yang saya temukan sebagai solusi yang mungkin, adalah bahwa .broadcast()
metode menerima sebagai parameter kedua array SessionIds yang tidak mengirim pesan, jadi saya bisa meneruskan array dengan semua SessionIds yang terhubung pada saat itu ke server, kecuali yang Saya ingin mengirim pesan, tetapi saya merasa harus ada solusi yang lebih baik.
Ada ide?
sumber
Jawaban Ivo Wetzel sepertinya tidak berlaku lagi di Socket.io 0.9 lagi.
Singkatnya, Anda sekarang harus menyimpan
socket.id
dan menggunakannyaio.sockets.socket(savedSocketId).emit(...)
untuk mengirim pesan kepadanya.Ini adalah bagaimana saya membuatnya bekerja di server Node.js yang dikelompokkan:
Pertama, Anda perlu mengatur toko Redis sebagai toko sehingga pesan dapat melewati proses:
Saya menghilangkan kode pengelompokan di sini, karena itu membuat ini lebih berantakan, tetapi sepele untuk ditambahkan. Cukup tambahkan semuanya ke kode pekerja. Lebih banyak dokumen di sini http://nodejs.org/api/cluster.html
sumber
io.of('/mynamespace').sockets[socketID].emit(...)
(tidak tahu apakah itu karena saya menggunakan namespace)io.sockets.socket(socket_id)
dihapus di socket.io 1.0. github.com/socketio/socket.io/issues/1618#issuecomment-46151246setiap soket bergabung dengan sebuah ruangan dengan id soket untuk sebuah nama, jadi Anda bisa saja
docs: http://socket.io/docs/rooms-and-namespaces/#default-room
Bersulang
sumber
io.sockets.connected[socketid].emit();
. Diuji dengan 1.4.6.Solusi paling sederhana, paling elegan
Semudah:
Dan itu saja.
Tapi bagaimana caranya? Berikan saya contoh
Apa yang kita semua butuhkan sebenarnya adalah contoh lengkap, dan itulah yang mengikuti. Ini diuji dengan versi socket.io terbaru (2.0.3) dan juga menggunakan Javascript modern (yang seharusnya kita semua gunakan sekarang).
Contohnya terdiri dari dua bagian: server dan klien. Setiap kali klien terhubung, klien mulai menerima nomor urut berkala dari server. Urutan baru dimulai untuk setiap klien baru, sehingga server harus melacaknya secara individual. Di situlah "Saya perlu mengirim pesan ke klien tertentu" mulai berperan. Kode ini sangat sederhana untuk dipahami. Mari kita lihat.
Server
server.js
Server mulai mendengarkan pada port 8000 untuk koneksi masuk. Ketika seseorang tiba, ia menambahkan klien baru itu ke peta sehingga ia dapat melacak nomor urutnya. Itu juga mendengarkan
disconnect
acara klien itu , ketika itu akan menghapusnya dari peta.Setiap detik, penghitung waktu diaktifkan. Ketika itu terjadi, server berjalan melalui peta dan mengirim pesan ke setiap klien dengan nomor urut saat ini. Itu kemudian bertambah dan menyimpan nomor kembali di peta. Itu semua untuk itu. Peasy mudah.
Klien
Bagian klien bahkan lebih sederhana. Itu hanya terhubung ke server dan mendengarkan
seq-num
pesan, mencetaknya ke konsol setiap kali itu tiba.client.js
Menjalankan contoh
Instal perpustakaan yang diperlukan:
Jalankan server:
Buka jendela terminal lain dan berikan klien sebanyak yang Anda inginkan dengan menjalankan:
Saya juga sudah menyiapkan inti dengan kode lengkap di sini .
sumber
Kamu bisa memakai
// kirim pesan hanya ke klien-pengirim
socket.emit('message', 'check this');
// atau Anda dapat mengirim ke semua pendengar termasuk pengirim
io.emit('message', 'check this');
// kirim ke semua pendengar kecuali pengirim
socket.broadcast.emit('message', 'this is a message');
// atau Anda dapat mengirimnya ke kamar
socket.broadcast.to('chatroom').emit('message', 'this is the message to all');
sumber
Di 1.0 Anda harus menggunakan:
sumber
io.sockets.connected["something"]
danemit
metodenya.Versi apa pun yang kami gunakan jika kami hanya console.log () objek "io" yang kami gunakan dalam kode nodejs sisi server kami, [mis. Io.on ('koneksi', fungsi (soket) {...});] , kita dapat melihat bahwa "io" hanyalah objek json dan ada banyak objek anak di mana id socket dan objek socket disimpan.
Saya menggunakan socket.io versi 1.3.5, btw.
Jika kita melihat pada objek io, itu berisi,
di sini kita dapat melihat socketid "B5AC9w0sYmOGWe4fAAAA" dll. Jadi, kita bisa melakukan,
Sekali lagi, pada pemeriksaan lebih lanjut kita dapat melihat segmen seperti,
Jadi, kita dapat mengambil soket dari sini dengan melakukan
Juga, di bawah mesin yang kami miliki,
Jadi, kita juga bisa menulis,
Jadi, saya kira kita dapat mencapai tujuan kita dengan salah satu dari 3 cara yang saya sebutkan di atas,
sumber
Kamu bisa melakukan ini
Di server.
Dan pada klien, sangat mudah untuk ditangani.
sumber
Pada versi 1.4.5, pastikan Anda memberikan socketId yang diawali dengan benar di io.to (). Saya mengambil socketId Klien login ke debug dan itu tanpa awalan jadi saya akhirnya mencari selamanya sampai saya tahu! Jadi, Anda mungkin harus melakukannya seperti ini jika ID yang Anda miliki tidak diawali:
sumber
io.sockets.sockets [socket.id] .emit (...) bekerja untuk saya di v0.9
sumber
Anda juga dapat menyimpan referensi klien. Tetapi ini membuat kenangan Anda sibuk.
Buat objek kosong dan setel klien Anda ke dalamnya.
kemudian panggil klien spesifik Anda dengan id dari objek
sumber
Socket.IO memungkinkan Anda untuk "namespace" soket Anda, yang pada dasarnya berarti menetapkan titik akhir atau jalur yang berbeda.
Ini mungkin membantu: http://socket.io/docs/rooms-and-namespaces/
sumber