Saya mencoba mendapatkan daftar semua soket / klien yang saat ini terhubung.
io.sockets
sayangnya, tidak mengembalikan array.
Saya tahu saya bisa menyimpan daftar saya sendiri menggunakan array, tetapi jangan berpikir ini adalah solusi optimal karena 2 alasan:
Redundansi. Socket.IO sudah menyimpan salinan daftar ini.
Socket.IO menyediakan metode untuk menetapkan nilai-nilai bidang arbitrer untuk klien (yaitu:)
socket.set('nickname', 'superman')
sehingga saya harus mengikuti perubahan ini jika saya ingin mempertahankan daftar saya sendiri.
Tolong?
socket
is id,io.sockets.sockets[socket]
adalah socket.err
dan jika Anda menggunakan penyimpanan memori itu selalunull
..get('nickname', function(err, nickname) { ... })
Jawaban:
Di Socket.IO 0.7 Anda memiliki
clients
metode pada namespaces, ini mengembalikan array semua soket yang terhubung.API tanpa ruang nama:
Untuk namespace
Semoga ini bisa membantu seseorang di masa depan
DIPERBARUI 2020 Maret 06
Dari 1.x dan di atas, lihat tautan ini: dapatkan berapa banyak orang di ruang obrolan di socket.io
sumber
connected
objek namespace.var clients = io.sockets.connected();
jelas tidak bekerja. Terima kasihSocket.io 1.4
Object.keys(io.sockets.sockets);
memberi Anda semua soket yang terhubung.Socket.io 1.0 Pada socket.io 1.0, jawaban yang diterima sebenarnya tidak berlaku lagi. Jadi saya membuat fungsi kecil yang saya gunakan sebagai perbaikan sementara:
Api untuk Tanpa namespace menjadi
Api untuk namespace menjadi:
Lihat juga pertanyaan terkait ini , di mana saya memberikan fungsi yang mengembalikan soket untuk ruangan tertentu.
Socket.io 0.7
API tanpa ruang nama :
Untuk namespace
Catatan: Karena tampaknya socket.io API cenderung rusak, dan beberapa solusi bergantung pada detail implementasi, itu bisa menjadi masalah melacak klien sendiri:
sumber
Setelah socket.io 1.0 kita tidak bisa menggunakan
lagi. Sebagai gantinya Anda dapat menggunakan yang berikut ini
sumber
var clients_in_the_room = io.sockets.adapter.rooms[roomId].sockets
Menggunakan Socket.IO 1.x:
Dapatkan berbagai klien yang terhubung:
Dapatkan jumlah klien yang terhubung:
sumber
Sangat sederhana di socket.io 1.3:
io.sockets.sockets
- adalah array yang berisi objek soket yang terhubung. Jika Anda menyimpan nama pengguna di setiap soket, Anda dapat melakukan:Ledakan. Anda memiliki nama semua pengguna yang terhubung.
sumber
(Object.keys(io.engine.clients)
Saya telah melalui rasa sakit ini hari ini. Socket.io akan jauh lebih baik jika mereka bisa membuat dokumentasi yang tepat untuk API mereka.
Lagi pula, saya mencoba melihat ke dalam io.sockets dan menemukan sejumlah opsi yang dapat kita gunakan:
Juga, perhatikan bahwa ketika menggunakan socket.io dengan namespace, metode di atas akan rusak karena io.sockets menjadi array bukan objek. Untuk menyelesaikannya, ganti saja io.sockets dengan io (mis. Io.sockets.connected menjadi io.connected, io.sockets.adapter.rooms menjadi io.adapter.rooms ...)
Diuji pada socket.io 1.3.5
sumber
Versi +2.0
Di versi +2.0 Anda menentukan namespace / kamar / node yang Anda tanyakan.
Seperti penyiaran, standarnya adalah semua klien dari namespace default ('/'):
Mendapat daftar ID klien yang terhubung ke namespace tertentu (di semua node jika berlaku).
Contoh untuk mendapatkan semua klien di ruang namespace:
Ini dari dokumentasi resmi: Socket.IO Server-API
sumber
socket.username
properti ke setiap soket saat menghubungkan, apakah ada cara saya dapat melihat semua objek soket ini (termasuk properti khusus yang saya tambahkan ke setiap soket)? (untuk referensi, saya saat ini menggunakan variabel objek global untuk menyimpan informasi soket tambahan ketika klien terhubung - jadi tidak menanyakan cara mengaturnya - hanya tertarik mengetahui apakah ada cara untuk melihat semua objek soket secara 'default') .console.log(io.sockets.connected)
- tampaknya menjadi sebuah objek di mana setiap nilai properti adalah "objek socket" yang berisi sifat ininsp
,server
,adaptor
,id
(string),client
,conn
,rooms
,acks
,connected
,disconnected
,handshake
,fns
,flags
,_rooms
,_events
,_eventsCount
dan akhirnyausername
yang merupakan properti kustom saya menambahkan satu sama soket koneksi.Saya pikir kita dapat mengakses objek soket dari server, dan Anda dapat menetapkan nama panggilan, dan mengarahkan id soketnya,
Pada
disconnect
silakan hapus nama panggilan dariio.sockets.sockets
.sumber
Ini adalah cara terbaik untuk mengaksesnya di socket.io 1.3
Object.keys(socket.adapter.rooms[room_id])
sumber
var room = io.sockets.adapter.rooms[room_id];
var connections = _.map(Object.keys(room), function(socketId){ return (io.sockets.connected[socketId].connected == true) });
Bagi siapa pun yang hanya ingin COUNT dari klien yang terhubung saya yakin ini akan melakukannya:
io.sockets.manager.server.connections
sumber
io.sockets.clients().length
io.sockets.manager.server.connections
danio.sockets.clients().length
tidak bekerja. Ini bekerja untuk saya - Hanya untuk hitungan -io.engine.clientsCount
dan untuk daftar klien -io.engine.clientsCount
. Sejak itu tetap seperti ini selama lebih dari 3 tahun. Sepertinya cara yang andal untuk mendapatkan info koneksi. (Berdasarkan jawaban Joseph Dykstra)Socket.io 1.4.4
Kode contoh untuk Anda.
Saya pikir akan membantu seseorang blok kode ini.
sumber
Di Socket.IO 1.4
Untuk mendapatkan larik Semua Pengguna yang terhubung:
Untuk mendapatkan Hitungan semua klien:
sumber
Pada socket.io 1.5, perhatikan perubahan dari indexOf yang tampaknya didepresiasi, dan diganti dengan valueOf
Untuk socket.io versi 2.0.3, kode berikut berfungsi:
sumber
pada socket.io 1.3 saya telah menyelesaikan ini dalam 2 baris
sumber
Socket.io 1.7.3 (+):
sumber
Untuk versi 2.3 ini berfungsi dan itu akan membuat Anda mendapatkan soket juga , bagi saya sepertinya socketIo berubah terlalu cepat dan banyak dengan sedikit dokumentasi yang dapat dibaca setelah menggunakannya untuk sementara waktu.
masih ini terasa tidak benar, karena saya selalu merasa dengan socket Io entah bagaimana
sumber
Saya percaya Anda dapat mengakses ini dari properti manajer soket?
sumber
Saya melihat banyak jawaban bagus di sini dan banyak di mana cukup berguna tetapi tidak cukup apa yang saya butuhkan. Saya menggunakan soket untuk fitur pubsub di mana klien yang tertarik dapat mendengarkan perubahan apa pun dalam catatan yang diberikan.
Masalah spesifik saya adalah soket yang sama bergabung dengan ruangan yang sama beberapa kali. Solusi untuk ini adalah untuk memeriksa apakah soket sudah memiliki ruangan di dalam properti kamarnya.
Semoga ini bisa membantu seseorang.
sumber
Ini adalah cara paling sederhana di Socket.IO 1.0+, jika Anda tidak menggunakan ruang nama atau kamar.
Ini terlihat pada namespace default dan menentukan panjang array soket, tanpa perlu menggunakan
Object.keys()
sumber
Pada versi 1.5.1, saya dapat mengakses semua soket di namespace dengan:
Untuk beberapa alasan, mereka menggunakan objek biasa bukan array untuk menyimpan ID soket.
sumber
of()
panggilan dirantai dalam kasus itu.Untuk mode kluster, gunakan redis-adapter
Karena setiap soket itu sendiri adalah sebuah ruangan, maka orang dapat menemukan apakah sebuah soket menggunakan yang sama.
sumber
Berikut ini adalah cara cepat untuk mengkonversi hash dari soket yang terhubung dari namespace menjadi array menggunakan generator ES6 (berlaku untuk socket.io> = v1.0.0):
sumber
Saya tidak tahu apakah ini masih berjalan. Tetapi sesuatu seperti inilah yang akhirnya saya gunakan (saya menyimpan objek sesi pada setiap soket yang terhubung, yang pada gilirannya berisi nama pengguna dan info lainnya:
sumber
Jika proyek memiliki cluster socket.io ini berarti adapter socket.io-redis sedang digunakan.
Jika case seperti di atas, mendapatkan proses id semua soket yang terhubung harus diterapkan melalui adaptor socket.io-redis . Contoh di bawah ini dapat digunakan untuk ini;
Silakan kunjungi halaman socket.io-redis github untuk lebih jelasnya.
sumber
[email protected]
Saya menggunakan Object.Keys untuk menghubungkan array soket. Kemudian dalam larik yang sama iterate dengan fungsi peta untuk membangun larik objek baru
Mungkin jawaban ini dapat membantu mendapatkan soket id / nama pengguna array.
sumber
v.10
sumber
socket.io 2.1.1
, saya dapatTypeError: clients.map is not a function
dan meskipun terlihat menjanjikan, saya tidak sepenuhnya yakin apa yang akan dicapai contoh di atas - saya berharap akan secara otomatis membuat array objek klien dengan nama pengguna termasuk :).