ホームページ ウェブフロントエンド jsチュートリアル JavaScript と Bun を使用した WebSocket ブロードキャスト

JavaScript と Bun を使用した WebSocket ブロードキャスト

Dec 09, 2024 am 01:29 AM

WebSocket broadcasting with JavaScript and Bun

ブロードキャストは 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): 現在のクライアントをチャネルから削除します。

フロー例

  1. クライアントは /chat に接続し、「the-group-chat」に登録します。
  2. クライアントはサーバーにメッセージを送信します。
    • メッセージは送信者にエコーバックされます。
    • サーバーは、チャネル内の他のすべてのクライアントにメッセージをブロードキャストします。
  3. クライアントが切断されると:
    • チャンネル登録が解除されています。
    • サーバーは残りのクライアントに切断について通知します。
  4. サーバーは 5 秒ごとに、すべてのクライアントに定期的なブロードキャスト メッセージを送信します。

結論

WebSocket は、リアルタイムのインタラクティブな Web アプリケーションを構築するための強力なツールです。従来の HTTP 通信とは異なり、WebSocket はサーバーと接続されたクライアント間のインスタント メッセージ交換を可能にする永続的な双方向チャネルを提供します。そのため、ライブ チャット、共同作業ツール、ゲーム、または低遅延通信が重要なアプリケーションなどのシナリオに最適です。

この記事 (およびシリーズ) では、Bun を使用した WebSocket サーバーのセットアップ、クライアント接続の処理、サブスクライブされたクライアントへのメッセージのブロードキャストの基本について説明しました。また、クライアントがチャネルに参加し、メッセージを送信し、他のクライアントとサーバー自体の両方から更新を受信できる、単純なグループ チャット システムを実装する方法も示しました。

Bun に組み込まれた WebSocket サポートと、サブスクライブ、パブリッシュ、サブスクライブ解除などの機能を活用することで、リアルタイム通信の管理が非常に簡単になります。定期的な更新の送信、すべてのクライアントへのブロードキャスト、または特定のチャネルの管理のいずれを行う場合でも、WebSocket はそのような要件を処理するための効率的かつスケーラブルな方法を提供します。

以上がJavaScript と Bun を使用した WebSocket ブロードキャストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptの進化:現在の傾向と将来の見通し JavaScriptの進化:現在の傾向と将来の見通し Apr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

JavaScriptエンジン:実装の比較 JavaScriptエンジン:実装の比較 Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? Apr 04, 2025 pm 02:06 PM

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...

See all articles