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

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 までご連絡ください。
JavaScriptのコア:CまたはCの上に構築されていますか?JavaScriptのコア:CまたはCの上に構築されていますか?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptアプリケーション:フロントエンドからバックエンドまでJavaScriptアプリケーション:フロントエンドからバックエンドまでMay 04, 2025 am 12:12 AM

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワーク:最新のWeb開発のパワーJavaScriptフレームワーク:最新のWeb開発のパワーMay 02, 2025 am 12:04 AM

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、型を使用してストリーミングしますnode.jsは、型を使用してストリーミングしますApr 30, 2025 am 08:22 AM

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

Python vs. JavaScript:パフォーマンスと効率の考慮事項Python vs. JavaScript:パフォーマンスと効率の考慮事項Apr 30, 2025 am 12:08 AM

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptの起源:その実装言語の調査JavaScriptの起源:その実装言語の調査Apr 29, 2025 am 12:51 AM

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

メモ帳++7.3.1

メモ帳++7.3.1

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

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!