Dalam posting blog saya sebelumnya, Socket.io, saya secara singkat memperkenalkan penggunaan dasar socket.io dan membuat demo ruang obrolan sederhana. Berdasarkan bab pengantar, artikel ini terus mengeksplorasi penggunaan lanjutan Socket.io. Artikel ini akan dimulai dari konfigurasi, kamar, acara, dll., Dan memperkenalkan beberapa API dan tindakan pencegahan praktis di Socket.io.
1. Konfigurasi
Socket.io menyediakan 4 API konfigurasi: io.configure, io.set, io.enable, io.disable. io.set mengatur item tunggal, dan io.enable dan io.disable digunakan untuk mengatur konfigurasi boolean dalam item tunggal. IO.configure memungkinkan Anda untuk mengkonfigurasi parameter yang berbeda untuk lingkungan produksi yang berbeda (seperti pengembangan, tes, dll.). Berikut ini mendefinisikan konfigurasi yang berbeda dari socket.io di dua lingkungan:
Salinan kode adalah sebagai berikut:
var io = membutuhkan ('socket.io'). Dengarkan (80);
io.configure ('Development', function () {
io.enable ('browser klien etag');
io.set ('level log', 1);
});
io.configure ('rilis', function () {
io.set ('transports', ['WebSocket']);
});
Berikut ini mencantumkan beberapa item konfigurasi yang umum digunakan. Untuk parameter konfigurasi tertentu, silakan merujuk ke wiki resmi.
1) .Transports (default ['WebSocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']): Array yang berisi jenis metode komunikasi. Socket.io mendukung berbagai cara untuk mewujudkan komunikasi online instan, seperti WebSocket, Polling, dll. Konfigurasi ini memungkinkan Anda untuk memilih metode komunikasi cadangan sendiri.
2) .log Level (default 3): Level terendah dari output log, 0 adalah kesalahan, 1 diperingatkan, 2 adalah info, dan 3 adalah debug, dan semua jenis log adalah output secara default.
3). Interval HeartBeat (default 25 detik): Paket detak jantung interval pengirim, klien perlu mengirim paket detak jantung ke server dalam periode waktu ini untuk mempertahankan komunikasi.
2. Kamar
Kamar adalah fitur yang sangat berguna yang disediakan oleh Socket.io. Ruangan ini setara dengan menyediakan namespace untuk beberapa klien tertentu, dan semua siaran dan komunikasi di dalam ruangan tidak akan mempengaruhi klien di luar ruangan.
Dalam pendahuluan, kita tahu bahwa socket.join ('nama kamar') dapat digunakan untuk memasuki ruangan dengan klien, dan socket.leave ('nama kamar') digunakan untuk meninggalkan ruangan. Ketika klien memasuki sebuah ruangan, pesan tersebut dapat disiarkan di ruangan dengan dua cara:
Salinan kode adalah sebagai berikut:
// 1. Menyiarkan acara ke kamar saya, dan pengirim akan dikecualikan (yaitu, tidak ada pesan yang akan diterima)
io.sockets.on ('connection', function (socket) {
// Catatan: Dibandingkan dengan yang berikut ini, berikut adalah untuk mengirimkan acara dari perspektif klien
socket.broadcast.to ('my room'). emit ('event_name', data);
}
// 2. Menyiarkan acara ke ruangan lain, dan semua klien di ruangan ini akan menerima pesan
// Catatan: Dibandingkan dengan hal di atas, di sini adalah untuk mengirimkan acara dari perspektif server
io.sockets.in ('Kamar Lain'). Emit ('event_name', data);
// disiarkan ke semua klien
io.sockets.emit ('event_name', data);
Selain menyiarkan pesan ke ruangan, Anda juga dapat memperoleh informasi kamar melalui API berikut.
Salinan kode adalah sebagai berikut:
// Dapatkan informasi tentang semua kamar
// Kunci adalah nama kamar, nilai adalah array ID soket yang sesuai dengan nama kamar
io.sockets.manager.rooms
// Dapatkan klien di kamar tertentu dan kembalikan semua instance soket di ruangan ini
io.sockets.Clients ('Kamar tertentu')
// Dapatkan informasi kamar yang dimasukkan oleh soket ini melalui soket.id
io.sockets.manager.roomClients [socket.id]
3. Acara
Socket.io memiliki beberapa acara default bawaan. Saat merancang acara, kita harus menghindari nama acara default dan secara fleksibel menggunakan acara default ini.
Acara sisi server:
1) .io.sockets.on ('koneksi', fungsi (soket) {}): dipicu setelah koneksi soket berhasil, digunakan untuk inisialisasi
socket.on ('pesan', fungsi (pesan, callback) {}): Acara ini dipicu ketika klien mentransmisikan pesan melalui socket.send. Pesannya adalah pesan yang dikirimkan. Callback adalah panggilan balik yang akan dieksekusi setelah menerima pesan.
2) .socket.on ('apapun', fungsi (data) {}): dipecat saat peristiwa diterima
3) .socket.on ('Disconnect', function () {}): Memicu ketika soket kehilangan koneksi (termasuk situasi pemutusan apa pun seperti menutup browser, secara aktif memutuskan sambungan, pemutusan, dll.)
Acara Klien:
1) .Connect: Koneksi berhasil
2) .Connecting: Menghubungkan
3) .Disconnect: Putuskan sambungan
4) .connect_failed: Koneksi gagal
5) .ROR: Terjadi kesalahan dan tidak dapat diproses oleh jenis peristiwa lainnya.
6) .Message: Acara pesan sisi server yang sama
7). Anything: Event apa pun di server yang sama
8) .reconnect_failed: Reconnect gagal
9) .Rekneksi: berhasil dihubungkan kembali
10) .Rekneksi: menghubungkan kembali
Di sini kita perlu menyebutkan pesanan ketika soket klien memulai koneksi. Ketika koneksi pertama terhubung, urutan pemicu acara adalah: Connect-> Connect; Ketika koneksi hilang, urutan pemicu peristiwa adalah: Disconnect-> Reconnecting (dapat dilakukan beberapa kali)-> Connecting-> Reconnect-> Connect-> Connect.
4. Otorisasi
1). Disiarkan ke semua klien: socket.broadcast.emit ('pesan siaran');
2). Masukkan ruangan (sangat mudah digunakan! Ini setara dengan namespace, yang dapat disiarkan ke kamar tertentu tanpa mempengaruhi klien di kamar lain atau tidak di kamar): socket.join ('nama kamar Anda');
3). Pesan siaran ke kamar (pengirim tidak dapat menerima pesan): socket.broadcast.to ('nama kamar Anda'). Emit ('Pesan Kamar Siaran');
4). Pesan siaran ke sebuah ruangan (termasuk pengirim dapat menerima pesan) (API ini milik io.sockets): io.sockets.in ('nama kamar lain'). Emit ('Pesan Kamar Siaran');
5). Force WebSocket Communication: (Client) Socket.send ('Hi'), (server) Gunakan socket.on ('pesan', fungsi (data) {}) untuk menerima.
Ini pada dasarnya adalah pengantar penggunaan lanjutan Socket.io. Saya pribadi merasa bahwa API dasar ini cukup dalam penggunaan sehari-hari, yang juga mencerminkan filosofi desain Socket.io yang sangat sederhana dan mudah digunakan. Artikel ini hanyalah cara untuk menarik perhatian. Saat menghadapi masalah yang tidak dapat diselesaikan dalam penggunaan aktual, akan lebih baik untuk memeriksa wiki resmi terperinci.