Penyiaran ialah salah satu ciri WebSockets yang paling berkuasa, membolehkan pelayan menghantar mesej kepada berbilang pelanggan yang disambungkan secara serentak. Tidak seperti komunikasi titik-ke-titik, di mana mesej ditukar antara pelanggan tunggal dan pelayan, penyiaran membolehkan satu mesej untuk mencapai sekumpulan pelanggan. Ini menjadikannya amat diperlukan untuk aplikasi masa nyata, kolaboratif dan interaktif.
Mengapa Penyiaran Penting
Penyiaran adalah penting untuk senario di mana berbilang pengguna perlu kekal disegerakkan atau dimaklumkan tentang kemas kini yang sama dalam masa nyata. Contohnya:
- Aplikasi sembang kumpulan: menghantar mesej kepada semua peserta dalam bilik sembang.
- Alat kolaboratif: mengemas kini semua pengguna tentang dokumen kongsi atau perubahan kandungan.
- Pemberitahuan langsung: menyiarkan berita tergempar, kemas kini saham atau skor sukan kepada berbilang pelanggan.
- Permainan dalam talian: menyegerakkan keadaan atau tindakan permainan merentas berbilang pemain.
Dalam kes sedemikian, penyiaran memastikan semua pengguna yang disambungkan disegerakkan tanpa memerlukan panggilan pelayan individu untuk setiap pelanggan, yang sebaliknya akan menjadi tidak cekap dan terdedah kepada kependaman.
Dua pendekatan untuk penyiaran
Apabila melaksanakan penyiaran, terdapat dua strategi biasa untuk dipertimbangkan:
- Penyiaran kepada semua pelanggan (termasuk pengirim)
- Penyiaran kepada semua pelanggan kecuali pengirim
Menyiarkan kepada semua pelanggan (termasuk pengirim)
Pendekatan ini menghantar mesej kepada semua pelanggan yang disambungkan ke saluran tertentu, termasuk saluran yang menghasilkan mesej.
Pendekatan ini sesuai untuk situasi di mana setiap pelanggan, termasuk pengirim, perlu menerima siaran, seperti memaparkan pengakuan atau kemas kini mesej mereka dalam sembang kumpulan.
Menyiarkan kepada semua pelanggan kecuali pengirim
Dalam kes ini, mesej disiarkan kepada semua pelanggan kecuali orang yang menghantarnya.
Pendekatan ini sesuai untuk senario di mana pengirim tidak perlu melihat mesej mereka sendiri dalam siaran, seperti permainan berbilang pemain di mana tindakan perlu dikongsi dengan pemain lain tetapi tidak bergema kembali kepada pemain yang melakukan tindakan itu .
Kedua-dua kaedah mempunyai kes penggunaan khusus dan boleh dilaksanakan dengan mudah dengan alatan seperti Bun, membolehkan pembangun mengendalikan penyiaran dengan cekap dengan kod minimum.
Artikel ini membincangkan cara menyediakan penyiaran WebSocket menggunakan Bun dan menunjukkan kedua-dua pendekatan penyiaran, membantu anda membina aplikasi masa nyata yang mantap.
Kod untuk penyiaran dengan WebSockets
Dalam artikel pertama siri ini, WebSocket dengan JavaScript dan Bun, kami meneroka struktur pelayan WebSocket yang membalas mesej yang dihantar oleh pelanggan.
Artikel ini akan meneroka langganan saluran, mekanisme yang membolehkan penyiaran mesej kepada berbilang pelanggan.
Kami akan mulakan dengan membentangkan kod lengkap dan kemudian memecahkannya untuk meneroka semua bahagian yang berkaitan dengan terperinci.
Buat fail broadcast.ts:
console.log("? Hello via Bun! ?"); const server = Bun.serve({ port: 8080, // defaults to $BUN_PORT, $PORT, $NODE_PORT otherwise 3000 fetch(req, server) { const url = new URL(req.url); if (url.pathname === "/") return new Response(Bun.file("./index.html")); if (url.pathname === "/surprise") return new Response("?"); if (url.pathname === "/chat") { if (server.upgrade(req)) { return; // do not return a Response } return new Response("Upgrade failed", { status: 400 }); } return new Response("404!"); }, websocket: { message(ws, message) { console.log("✉️ A new Websocket Message is received: " + message); ws.send("✉️ I received a message from you: " + message); ws.publish( "the-group-chat", `? Message from ${ws.remoteAddress}: ${message}`, ); }, // a message is received open(ws) { console.log("? A new Websocket Connection"); ws.subscribe("the-group-chat"); ws.send("? Welcome baby"); ws.publish("the-group-chat", "? A new friend is joining the Party"); }, // a socket is opened close(ws, code, message) { console.log("⏹️ A Websocket Connection is CLOSED"); const msg = `A Friend has left the chat`; ws.unsubscribe("the-group-chat"); ws.publish("the-group-chat", msg); }, // a socket is closed drain(ws) { console.log("DRAIN EVENT"); }, // the socket is ready to receive more data }, }); console.log(`? Server (HTTP and WebSocket) is launched ${server.url.origin}`); setInterval(() => { const msg = "Hello from the Server, this is a periodic message!"; server.publish("the-group-chat", msg); console.log(`Message sent to "the-group-chat": ${msg}`); }, 5000); // 5000 ms = 5 seconds
anda boleh menjalankannya melalui:
bun run broadcast.ts
Kod ini memperkenalkan penyiaran, membenarkan pelayan menghantar mesej kepada semua pelanggan yang dilanggan dalam saluran tertentu. Ia juga membezakan antara penyiaran kepada semua pelanggan (termasuk pengirim) atau tidak termasuk pengirim. Berikut ialah penjelasan terperinci:
Memulakan pelayan
const server = Bun.serve({ port: 8080, ... });
Permulaan adalah sama dengan artikel sebelumnya.
Pelayan mendengar pada port 8080 dan serupa dengan contoh sebelumnya, ia mengendalikan permintaan HTTP dan meningkatkan sambungan WebSocket untuk /sembang.
Penyiaran dalam WebSockets
Penyiaran membenarkan mesej dihantar kepada semua pelanggan yang melanggan saluran tertentu, seperti sembang kumpulan.
Begini cara kod mencapai ini:
Melanggan saluran (dalam Acara terbuka)
open(ws) { console.log("? A new Websocket Connection"); ws.subscribe("the-group-chat"); ws.send("? Welcome baby"); ws.publish("the-group-chat", "? A new friend is joining the Party"); }
- ws.subscribe(channel): melanggan pelanggan ke saluran the-group-chat. Semua pelanggan dalam saluran ini kini boleh menerima mesej yang disiarkan kepadanya.
- ws.send(...): pelanggan dialu-alukan secara individu .
- ws.publish(saluran, mesej): menyiarkan mesej kepada semua pelanggan dalam saluran.
Menyiarkan mesej (membalas/menyiarkan mesej daripada pelanggan dalam acara mesej)
message(ws, message) { console.log("✉️ A new Websocket Message is received: " + message); ws.send("✉️ I received a message from you: " + message); ws.publish("the-group-chat", `? Message from ${ws.remoteAddress}: ${message}`); }
Apabila mesej diterima daripada pelanggan:
- Penghantar mendapat pengakuan melalui ws.send(...).
- Mesej disiarkan kepada semua pelanggan (tidak termasuk pengirim) dalam "the-group-chat" menggunakan ws.publish(...).
Nota: Pengirim tidak menerima mesej siaran kerana kami memanggil kaedah terbitkan pada objek ws. Anda harus menggunakan objek pelayan untuk memasukkan pengirim.
Menyahlanggan dan menyiarkan pada putus sambungan (dalam acara tertutup)
close(ws, code, message) { console.log("⏹️ A Websocket Connection is CLOSED"); const msg = `A Friend has left the chat`; ws.unsubscribe("the-group-chat"); ws.publish("the-group-chat", msg); }
Apabila pelanggan memutuskan sambungan:
- ws.unsubscribe(channel): mengalih keluar pelanggan daripada langganan saluran.
- Satu mesej disiarkan kepada semua pelanggan yang tinggal dalam saluran, memberitahu mereka tentang pemutusan sambungan.
Mesej pelayan berkala kepada semua pelanggan
console.log("? Hello via Bun! ?"); const server = Bun.serve({ port: 8080, // defaults to $BUN_PORT, $PORT, $NODE_PORT otherwise 3000 fetch(req, server) { const url = new URL(req.url); if (url.pathname === "/") return new Response(Bun.file("./index.html")); if (url.pathname === "/surprise") return new Response("?"); if (url.pathname === "/chat") { if (server.upgrade(req)) { return; // do not return a Response } return new Response("Upgrade failed", { status: 400 }); } return new Response("404!"); }, websocket: { message(ws, message) { console.log("✉️ A new Websocket Message is received: " + message); ws.send("✉️ I received a message from you: " + message); ws.publish( "the-group-chat", `? Message from ${ws.remoteAddress}: ${message}`, ); }, // a message is received open(ws) { console.log("? A new Websocket Connection"); ws.subscribe("the-group-chat"); ws.send("? Welcome baby"); ws.publish("the-group-chat", "? A new friend is joining the Party"); }, // a socket is opened close(ws, code, message) { console.log("⏹️ A Websocket Connection is CLOSED"); const msg = `A Friend has left the chat`; ws.unsubscribe("the-group-chat"); ws.publish("the-group-chat", msg); }, // a socket is closed drain(ws) { console.log("DRAIN EVENT"); }, // the socket is ready to receive more data }, }); console.log(`? Server (HTTP and WebSocket) is launched ${server.url.origin}`); setInterval(() => { const msg = "Hello from the Server, this is a periodic message!"; server.publish("the-group-chat", msg); console.log(`Message sent to "the-group-chat": ${msg}`); }, 5000); // 5000 ms = 5 seconds
Setiap 5 saat, pelayan menyiarkan mesej kepada semua pelanggan dalam saluran "the-group-chat" menggunakan server.publish(...). Di sini kami menggunakan objek pelayan.
Kaedah utama
- ws.subscribe(channel): melanggan klien WebSocket semasa ke saluran untuk komunikasi kumpulan.
- ws.publish(saluran, mesej): menyiarkan mesej kepada semua pelanggan dalam saluran yang ditentukan (tidak termasuk pengirim).
- server.publish(channel, message): serupa dengan ws.publish, tetapi digunakan pada peringkat pelayan untuk penyiaran kepada semua pelanggan yang dilanggan (termasuk pengirim).
- ws.unsubscribe(channel): mengalih keluar pelanggan semasa daripada saluran.
Contoh aliran
- Seorang pelanggan menyambung ke /chat, melanggan "the-group-chat".
- Pelanggan menghantar mesej kepada pelayan:
- Mesej itu bergema kembali kepada pengirim.
- Pelayan menyiarkan mesej kepada semua pelanggan lain dalam saluran.
- Apabila pelanggan memutuskan sambungan:
- ia telah menyahlanggan saluran.
- Pelayan memberitahu pelanggan yang tinggal tentang pemutusan sambungan.
- Setiap 5 saat, pelayan menghantar mesej siaran berkala kepada semua pelanggan.
Kesimpulan
WebSockets ialah alat yang berkuasa untuk membina aplikasi web interaktif masa nyata. Tidak seperti komunikasi HTTP tradisional, WebSockets menyediakan saluran dua hala yang berterusan yang membolehkan pertukaran mesej segera antara pelayan dan pelanggan yang disambungkan. Ini menjadikan mereka sesuai untuk senario seperti sembang langsung, alatan kolaboratif, permainan atau sebarang aplikasi yang komunikasi kependaman rendah adalah penting.
Dalam artikel ini (dan dalam siri ini), kami meneroka asas menyediakan pelayan WebSocket menggunakan Bun, mengendalikan sambungan pelanggan dan menyiarkan mesej kepada pelanggan yang dilanggan. Kami juga menunjukkan cara melaksanakan sistem sembang kumpulan mudah di mana pelanggan boleh menyertai saluran, menghantar mesej dan menerima kemas kini daripada pelanggan lain dan pelayan itu sendiri.
Dengan memanfaatkan sokongan WebSocket terbina dalam Bun dan ciri seperti melanggan, menerbitkan dan menyahlanggan, ia menjadi sangat mudah untuk mengurus komunikasi masa nyata. Sama ada anda menghantar kemas kini berkala, penyiaran kepada semua pelanggan atau mengurus saluran tertentu, WebSockets menyediakan cara yang cekap dan berskala untuk mengendalikan keperluan tersebut.
Atas ialah kandungan terperinci Penyiaran WebSocket dengan JavaScript dan Bun. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Penjelasan terperinci mengenai kaedah penggantian rentetan javascript dan Soalan Lazim Artikel ini akan meneroka dua cara untuk menggantikan watak rentetan dalam JavaScript: Kod JavaScript dalaman dan HTML dalaman untuk laman web. Ganti rentetan di dalam kod JavaScript Cara yang paling langsung ialah menggunakan kaedah pengganti (): str = str.replace ("cari", "ganti"); Kaedah ini hanya menggantikan perlawanan pertama. Untuk menggantikan semua perlawanan, gunakan ungkapan biasa dan tambahkan bendera global g: str = str.replace (/fi

Jadi di sini anda, bersedia untuk mempelajari semua perkara ini yang dipanggil Ajax. Tetapi, apa sebenarnya? Istilah Ajax merujuk kepada kumpulan teknologi longgar yang digunakan untuk membuat kandungan web yang dinamik dan interaktif. Istilah Ajax, yang asalnya dicipta oleh Jesse J

10 Plugin Permainan JQuery yang menyeronokkan untuk menjadikan laman web anda lebih menarik dan meningkatkan keletihan pengguna! Walaupun Flash masih merupakan perisian terbaik untuk membangunkan permainan web kasual, jQuery juga boleh menghasilkan kesan yang mengejutkan, dan walaupun tidak setanding dengan permainan flash aksi tulen, dalam beberapa kes, anda juga boleh bersenang -senang di penyemak imbas anda. permainan jquery tic toe "Hello World" pengaturcaraan permainan kini mempunyai versi jQuery. Kod sumber JQuery Game Composition Crazy Word Ini adalah permainan mengisi kosong, dan ia dapat menghasilkan beberapa hasil yang pelik kerana tidak mengetahui konteks perkataan. Kod sumber JQuery Mine Sweeping Game

Artikel membincangkan membuat, menerbitkan, dan mengekalkan perpustakaan JavaScript, memberi tumpuan kepada perancangan, pembangunan, ujian, dokumentasi, dan strategi promosi.

Tutorial ini menunjukkan cara membuat kesan latar belakang paralaks yang menawan menggunakan jQuery. Kami akan membina sepanduk header dengan imej berlapis yang mewujudkan kedalaman visual yang menakjubkan. Plugin yang dikemas kini berfungsi dengan JQuery 1.6.4 dan kemudian. Muat turun

Artikel ini membincangkan strategi untuk mengoptimumkan prestasi JavaScript dalam pelayar, memberi tumpuan kepada mengurangkan masa pelaksanaan dan meminimumkan kesan pada kelajuan beban halaman.

Matter.js adalah enjin fizik badan tegar 2D yang ditulis dalam JavaScript. Perpustakaan ini dapat membantu anda dengan mudah mensimulasikan fizik 2D dalam penyemak imbas anda. Ia menyediakan banyak ciri, seperti keupayaan untuk mencipta badan yang tegar dan menetapkan sifat fizikal seperti jisim, kawasan, atau ketumpatan. Anda juga boleh mensimulasikan pelbagai jenis perlanggaran dan daya, seperti geseran graviti. Matter.js menyokong semua pelayar arus perdana. Di samping itu, ia sesuai untuk peranti mudah alih kerana ia mengesan sentuhan dan responsif. Semua ciri-ciri ini menjadikannya bernilai masa untuk belajar menggunakan enjin, kerana ini memudahkan untuk membuat permainan atau simulasi 2D berasaskan fizik. Dalam tutorial ini, saya akan merangkumi asas -asas perpustakaan ini, termasuk pemasangan dan penggunaannya, dan menyediakan

Artikel ini menunjukkan bagaimana untuk menyegarkan semula kandungan div secara automatik setiap 5 saat menggunakan jQuery dan Ajax. Contohnya mengambil dan memaparkan catatan blog terkini dari suapan RSS, bersama -sama dengan timestamp refresh terakhir. Imej pemuatan adalah opsyena


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

Dreamweaver Mac版
Alat pembangunan web visual

Pelayar Peperiksaan Selamat
Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

mPDF
mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),