Ini adalah kesamaan ruang nama dan ruang (socket.io v0.9.8 - harap dicatat bahwa v1.0 melibatkan penulisan ulang yang lengkap, sehingga hal-hal mungkin telah berubah):
Beberapa ruang nama dan beberapa kamar berbagi koneksi (WebSocket) yang sama
Server akan mengirimkan pesan melalui kawat hanya ke klien yang terhubung ke / bergabung dengan nsp / kamar, artinya bukan hanya pemfilteran sisi klien
The perbedaan :
namespaces terhubung oleh klien menggunakan io.connect(urlAndNsp)(klien akan ditambahkan ke namespace hanya jika sudah ada di server)
kamar hanya bisa digabung di sisi server (meskipun membuat API di sisi server agar klien dapat bergabung dengan mudah)
otorisasi tidak tersedia dengan kamar , tetapi otorisasi khusus dapat ditambahkan ke API yang disebutkan sebelumnya dan mudah dibuat di server, jika seseorang ingin menggunakan kamar
kamar adalah bagian dari namespace (default ke namespace 'global')
ruang nama selalu berakar dalam lingkup global
Untuk tidak membingungkan konsep dengan nama (ruang atau namespace), saya akan menggunakan kompartemen untuk merujuk pada konsep, dan dua nama lainnya untuk implementasi konsep. Jadi jika kamu
membutuhkan otorisasi per kompartemen , ruang nama mungkin merupakan rute termudah untuk diambil
jika Anda ingin kompartemen berlapis hierarkis (maks 2 lapisan), gunakan kombo namespace / ruang
jika aplikasi sisi klien Anda terdiri dari bagian-bagian berbeda yang (tidak peduli dengan kompartemen tetapi) perlu dipisahkan satu sama lain, gunakan ruang nama.
Contoh untuk yang terakhir adalah aplikasi klien besar di mana modul yang berbeda, mungkin dikembangkan secara terpisah (misalnya pihak ketiga), masing-masing menggunakan socket.io secara independen, sedang digunakan dalam aplikasi yang sama dan ingin berbagi koneksi jaringan tunggal.
Tidak benar-benar membandingkan ini, menurut saya jika Anda hanya perlu kompartemen sederhana dalam proyek Anda untuk memisahkan dan mengelompokkan pesan, salah satunya baik-baik saja.
Tidak yakin apakah itu menjawab pertanyaan Anda, tetapi penelitian yang mengarah ke jawaban ini setidaknya membantu saya melihat lebih jelas.
Bisakah kita mengatakan namespace adalah area tertentu dari aplikasi web saya dan ruang sekelompok klien di area itu?
Onaiggac
Bisakah Anda menambahkan sesuatu tentang saat memutuskan sambungan dari ruang / namespace. Apa yang terjadi pada mereka ketika klien memutus atau kehilangan koneksi sementara. Di sini tertulis: Setelah pemutusan, soket meninggalkan semua saluran mereka bagian dari secara otomatis, dan tidak ada teardown khusus diperlukan pada bagian Anda. Apakah Saluran sama dengan Kompartemen Anda ?
Wilt
67
Ini adalah pertanyaan lama tetapi setelah melakukan penelitian pada topik saya menemukan bahwa jawaban yang diterima tidak jelas pada poin penting. Menurut Guillermo Rauch sendiri ( lihat tautan ): meskipun secara teori dimungkinkan untuk membuat ruang nama secara dinamis pada aplikasi yang sedang berjalan, Anda menggunakannya terutama sebagai bagian terpisah dari aplikasi Anda. Jika, di sisi lain Anda perlu membuat kompartemen ad hoc, on the fly, untuk mengakomodasi kelompok pengguna / koneksi, yang terbaik adalah menggunakan kamar.
Perbedaan utama adalah kamar lebih sulit untuk diimplementasikan. Anda harus membuat metode untuk bergabung dengan kamar dengan setiap ulang halaman.
Dengan ruang nama Anda hanya perlu menulis var example = io.connect('http://localhost/example');di klien javascript Anda dan klien secara otomatis ditambahkan dalam ruang nama.
Namespaces memungkinkan Anda untuk membuat objek dengan nama yang sama, tetapi mereka akan terpisah karena mereka akan hidup di ruang nama yang berbeda, atau dikenal sebagai lingkup.
Ini adalah proses pemikiran yang sama yang harus Anda miliki dengan Socket.IO namespaces. Jika Anda sedang membangun aplikasi web Node modular, Anda akan ingin namespace keluar modul yang berbeda. Jika Anda melihat kembali kode namespace kami, Anda akan melihat bahwa kami dapat mendengarkan acara yang sama persis di ruang nama yang berbeda. Di Socket.IO, acara koneksi di koneksi default dan acara koneksi di a / xxx namespace berbeda. Misalnya, jika Anda memiliki sistem obrolan dan komentar di situs Anda dan ingin keduanya menjadi waktu nyata, Anda dapat menggunakan namespace masing-masing. Ini memungkinkan Anda untuk membangun seluruh aplikasi Socket.IO yang hanya hidup dalam konteksnya sendiri.
Ini juga berlaku jika Anda sedang membangun sesuatu untuk dikemas dan diinstal. Anda tidak dapat mengetahui apakah seseorang sudah menggunakan acara tertentu di namespace default, jadi Anda harus membuatnya sendiri dan mendengarkan di sana. Ini memungkinkan Anda untuk tidak menginjak-injak pengembang mana pun yang menggunakan paket Anda.
Namespaces memungkinkan kita untuk mengukir koneksi ke dalam konteks yang berbeda. Kita dapat membandingkan ini dengan kamar, yang memungkinkan kita untuk mengelompokkan koneksi bersama. Kita kemudian dapat memiliki koneksi yang sama bergabung dengan kamar lain, juga.
Namespaces memungkinkan Anda untuk membuat konteks berbeda agar Socket.IO berfungsi. Kamar memungkinkan Anda untuk mengelompokkan koneksi klien di dalam konteks tersebut.
Ini adalah pertanyaan lama tetapi setelah melakukan penelitian pada topik saya menemukan bahwa jawaban yang diterima tidak jelas pada poin penting. Menurut Guillermo Rauch sendiri ( lihat tautan ): meskipun secara teori dimungkinkan untuk membuat ruang nama secara dinamis pada aplikasi yang sedang berjalan, Anda menggunakannya terutama sebagai bagian terpisah dari aplikasi Anda. Jika, di sisi lain Anda perlu membuat kompartemen ad hoc, on the fly, untuk mengakomodasi kelompok pengguna / koneksi, yang terbaik adalah menggunakan kamar.
sumber
Itu tergantung apa yang ingin Anda lakukan.
Perbedaan utama adalah kamar lebih sulit untuk diimplementasikan. Anda harus membuat metode untuk bergabung dengan kamar dengan setiap ulang halaman.
Dengan ruang nama Anda hanya perlu menulis
var example = io.connect('http://localhost/example');
di klien javascript Anda dan klien secara otomatis ditambahkan dalam ruang nama.Contoh pemanfaatan:
sumber
Kamar dan ruang komunikasi segmen dan soket grup individu.
Siaran ke sebuah ruangan atau ruang nama tidak akan menjangkau semua orang hanya anggota.
Perbedaan antara ruang nama dan kamar adalah sebagai berikut:
Perbedaannya adalah siapa yang mengelola mereka
Untuk memutuskan apa yang akan digunakan, Anda harus memutuskan apakah segmentasi harus dikelola di frontend atau di backend
sumber
Namespaces memungkinkan Anda untuk membuat objek dengan nama yang sama, tetapi mereka akan terpisah karena mereka akan hidup di ruang nama yang berbeda, atau dikenal sebagai lingkup.
Ini adalah proses pemikiran yang sama yang harus Anda miliki dengan Socket.IO namespaces. Jika Anda sedang membangun aplikasi web Node modular, Anda akan ingin namespace keluar modul yang berbeda. Jika Anda melihat kembali kode namespace kami, Anda akan melihat bahwa kami dapat mendengarkan acara yang sama persis di ruang nama yang berbeda. Di Socket.IO, acara koneksi di koneksi default dan acara koneksi di a / xxx namespace berbeda. Misalnya, jika Anda memiliki sistem obrolan dan komentar di situs Anda dan ingin keduanya menjadi waktu nyata, Anda dapat menggunakan namespace masing-masing. Ini memungkinkan Anda untuk membangun seluruh aplikasi Socket.IO yang hanya hidup dalam konteksnya sendiri.
Ini juga berlaku jika Anda sedang membangun sesuatu untuk dikemas dan diinstal. Anda tidak dapat mengetahui apakah seseorang sudah menggunakan acara tertentu di namespace default, jadi Anda harus membuatnya sendiri dan mendengarkan di sana. Ini memungkinkan Anda untuk tidak menginjak-injak pengembang mana pun yang menggunakan paket Anda.
Namespaces memungkinkan kita untuk mengukir koneksi ke dalam konteks yang berbeda. Kita dapat membandingkan ini dengan kamar, yang memungkinkan kita untuk mengelompokkan koneksi bersama. Kita kemudian dapat memiliki koneksi yang sama bergabung dengan kamar lain, juga.
Namespaces memungkinkan Anda untuk membuat konteks berbeda agar Socket.IO berfungsi. Kamar memungkinkan Anda untuk mengelompokkan koneksi klien di dalam konteks tersebut.
sumber