ブロードキャストは WebSocket の最も強力な機能の 1 つであり、サーバーが接続されている複数のクライアントにメッセージを同時に送信できるようになります。単一のクライアントとサーバー間でメッセージが交換されるポイントツーポイント通信とは異なり、ブロードキャストにより、単一のメッセージがクライアントのグループに到達できます。このため、リアルタイム、共同作業、対話型のアプリケーションには不可欠なものとなります。
なぜブロードキャストが重要なのか
ブロードキャストは、複数のユーザーが同期を維持したり、同じ更新についてリアルタイムで通知したりする必要があるシナリオには不可欠です。例:
- グループ チャット アプリケーション: チャット ルームの参加者全員にメッセージを送信します。
- 共同ツール: 共有ドキュメントやコンテンツの変更についてすべてのユーザーを更新します。
- ライブ通知: ニュース速報、株価更新、スポーツのスコアなどを複数の加入者にブロードキャストします。
- オンライン ゲーム: 複数のプレーヤー間でゲームの状態やアクションを同期します。
そのような場合、ブロードキャストにより、クライアントごとに個別のサーバー呼び出しを必要とせずに、接続されているすべてのユーザーの同期が確保されます。ブロードキャストしないと、非効率的で遅延が発生しやすくなります。
放送に対する 2 つのアプローチ
ブロードキャストを実装する場合、考慮すべき一般的な戦略が 2 つあります。
- すべてのクライアント (送信者を含む) にブロードキャストします
- 送信者を除くすべてのクライアントにブロードキャストします
すべてのクライアント (送信者を含む) にブロードキャストします。
このアプローチでは、メッセージを送信元のチャネルを含む、特定のチャネルに接続されているすべてのクライアントにメッセージが送信されます。
このアプローチは、グループ チャットでメッセージの確認や更新を表示するなど、送信者を含むすべてのクライアントがブロードキャストを受信する必要がある状況に適しています。
送信者を除くすべてのクライアントにブロードキャストする
この場合、メッセージは送信者を除くすべてのクライアントにブロードキャストされます。
このアプローチは、アクションを他のプレイヤーと共有する必要があるが、アクションを実行しているプレイヤーにエコーバックされないマルチプレイヤー ゲームなど、送信者がブロードキャストで自分のメッセージを見る必要がないシナリオに最適です。 .
どちらの方法にも特定の使用例があり、Bun などのツールを使用して簡単に実装できるため、開発者は最小限のコードで効率的にブロードキャストを処理できます。
この記事では、Bun を使用して WebSocket ブロードキャストを設定する方法を詳しく説明し、堅牢なリアルタイム アプリケーションの構築に役立つ両方のブロードキャスト アプローチを示します。
WebSocket でブロードキャストするためのコード
このシリーズの最初の記事「JavaScript と Bun を使用した WebSocket」では、クライアントから送信されたメッセージに応答する WebSocket サーバーの構造について説明しました。
この記事では、複数のクライアントにメッセージをブロードキャストできるメカニズムであるチャンネル サブスクリプションについて説明します。
まず完全なコードを提示し、次にそれを分解して関連するすべての部分を詳しく調べます。
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
次の方法で実行できます:
bun run broadcast.ts
このコードでは ブロードキャスト を導入し、サーバーが特定のチャネルでサブスクライブしているすべてのクライアントにメッセージを送信できるようにします。また、すべてのクライアント (送信者を含む) にブロードキャストするか、送信者を除外するかも区別されます。詳細な説明は次のとおりです:
サーバーの初期化
const server = Bun.serve({ port: 8080, ... });
初期化は前回の記事と同じです。
サーバーはポート 8080 でリッスンし、前の例と同様に、HTTP リクエストを処理し、/chat の WebSocket 接続をアップグレードします。
WebSocket でのブロードキャスト
ブロードキャストにより、グループ チャットなど、特定のチャネルに登録しているすべてのクライアントにメッセージを送信できます。
これをコードで実現する方法は次のとおりです。
チャンネルの購読 (オープンイベント内)
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): クライアントをチャネル the-group-chat にサブスクライブします。このチャネル内のすべてのクライアントは、このチャネルにブロードキャストされたメッセージを受信できるようになります。
- ws.send(...): クライアントは個別に歓迎されます。
- ws.publish(channel, message): チャネル内のすべてのクライアントにメッセージをブロードキャストします。
ブロードキャストメッセージ (メッセージイベントでのクライアントからのメッセージの返信/ブロードキャスト)
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}`); }
クライアントからメッセージを受信したとき:
- 送信者は ws.send(...) 経由で確認応答を受け取ります。
- メッセージは、ws.publish(...) を使用して「グループチャット」内のすべてのクライアント (送信者を除く) にブロードキャストされます。
注: ws オブジェクトの公開メソッドを呼び出しているため、送信者はブロードキャスト メッセージを受信しません。サーバー オブジェクトを使用して送信者を含める必要があります。
切断時のサブスクライブ解除とブロードキャスト (クローズイベント時)
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); }
クライアントが切断されたとき:
- ws.unsubscribe(channel): チャネル サブスクリプションからクライアントを削除します。
- チャネル内の残りのすべてのクライアントにメッセージがブロードキャストされ、切断が通知されます。
すべてのクライアントへの定期的なサーバー メッセージ
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
サーバーは、server.publish(...) を使用して、5 秒ごとに「the-group-chat」チャネル内のすべてのクライアントにメッセージをブロードキャストします。ここではサーバー オブジェクトを使用しています。
主な方法
- ws.subscribe(channel): 現在の WebSocket クライアントをグループ通信用のチャネルにサブスクライブします。
- ws.publish(channel, message): 指定されたチャネル内のすべてのクライアント (送信者を除く) にメッセージをブロードキャストします。
- server.publish(channel, message): ws.publish に似ていますが、購読しているすべてのクライアント (送信者を含む) にブロードキャストするためにサーバー レベルで使用されます。
- ws.unsubscribe(channel): 現在のクライアントをチャネルから削除します。
フロー例
- クライアントは /chat に接続し、「the-group-chat」に登録します。
- クライアントはサーバーにメッセージを送信します。
- メッセージは送信者にエコーバックされます。
- サーバーは、チャネル内の他のすべてのクライアントにメッセージをブロードキャストします。
- クライアントが切断されると:
- チャンネル登録が解除されています。
- サーバーは残りのクライアントに切断について通知します。
- サーバーは 5 秒ごとに、すべてのクライアントに定期的なブロードキャスト メッセージを送信します。
結論
WebSocket は、リアルタイムのインタラクティブな Web アプリケーションを構築するための強力なツールです。従来の HTTP 通信とは異なり、WebSocket はサーバーと接続されたクライアント間のインスタント メッセージ交換を可能にする永続的な双方向チャネルを提供します。そのため、ライブ チャット、共同作業ツール、ゲーム、または低遅延通信が重要なアプリケーションなどのシナリオに最適です。
この記事 (およびシリーズ) では、Bun を使用した WebSocket サーバーのセットアップ、クライアント接続の処理、サブスクライブされたクライアントへのメッセージのブロードキャストの基本について説明しました。また、クライアントがチャネルに参加し、メッセージを送信し、他のクライアントとサーバー自体の両方から更新を受信できる、単純なグループ チャット システムを実装する方法も示しました。
Bun に組み込まれた WebSocket サポートと、サブスクライブ、パブリッシュ、サブスクライブ解除などの機能を活用することで、リアルタイム通信の管理が非常に簡単になります。定期的な更新の送信、すべてのクライアントへのブロードキャスト、または特定のチャネルの管理のいずれを行う場合でも、WebSocket はそのような要件を処理するための効率的かつスケーラブルな方法を提供します。
以上がJavaScript と Bun を使用した WebSocket ブロードキャストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

10の楽しいjQueryゲームプラグインして、あなたのウェブサイトをより魅力的にし、ユーザーの粘着性を高めます! Flashは依然としてカジュアルなWebゲームを開発するのに最適なソフトウェアですが、jQueryは驚くべき効果を生み出すこともできます。また、純粋なアクションフラッシュゲームに匹敵するものではありませんが、場合によってはブラウザで予期せぬ楽しみもできます。 jquery tic toeゲーム ゲームプログラミングの「Hello World」には、JQueryバージョンがあります。 ソースコード jQueryクレイジーワードコンポジションゲーム これは空白のゲームであり、単語の文脈を知らないために奇妙な結果を生み出すことができます。 ソースコード jquery鉱山の掃引ゲーム

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

このチュートリアルでは、jQueryを使用して魅惑的な視差の背景効果を作成する方法を示しています。 見事な視覚的な深さを作成するレイヤー画像を備えたヘッダーバナーを構築します。 更新されたプラグインは、jQuery 1.6.4以降で動作します。 ダウンロードしてください

この記事では、JQueryとAjaxを使用して5秒ごとにDivのコンテンツを自動的に更新する方法を示しています。 この例は、RSSフィードからの最新のブログ投稿と、最後の更新タイムスタンプを取得して表示します。 読み込み画像はオプションです

Matter.jsは、JavaScriptで書かれた2D Rigid Body Physics Engineです。このライブラリは、ブラウザで2D物理学を簡単にシミュレートするのに役立ちます。剛体を作成し、質量、面積、密度などの物理的特性を割り当てる機能など、多くの機能を提供します。また、重力摩擦など、さまざまな種類の衝突や力をシミュレートすることもできます。 Matter.jsは、すべての主流ブラウザをサポートしています。さらに、タッチを検出し、応答性が高いため、モバイルデバイスに適しています。これらの機能はすべて、物理ベースの2Dゲームまたはシミュレーションを簡単に作成できるため、エンジンの使用方法を学ぶために時間をかける価値があります。このチュートリアルでは、このライブラリのインストールや使用法を含むこのライブラリの基本を取り上げ、

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

Dreamweaver Mac版
ビジュアル Web 開発ツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ホットトピック









