Heim Web-Frontend js-Tutorial WebSocket-Broadcasting mit JavaScript und Bun

WebSocket-Broadcasting mit JavaScript und Bun

Dec 09, 2024 am 01:29 AM

WebSocket broadcasting with JavaScript and Bun

Broadcasting ist eine der leistungsstärksten Funktionen von WebSockets und ermöglicht es Servern, Nachrichten gleichzeitig an mehrere verbundene Clients zu senden. Im Gegensatz zur Punkt-zu-Punkt-Kommunikation, bei der Nachrichten zwischen einem einzelnen Client und dem Server ausgetauscht werden, ermöglicht Broadcasting, dass eine einzelne Nachricht eine Gruppe von Clients erreicht. Dies macht es unverzichtbar für Echtzeit-, kollaborative und interaktive Anwendungen.


Warum Rundfunk wichtig ist

Broadcasting ist für Szenarien unerlässlich, in denen mehrere Benutzer synchronisiert oder in Echtzeit über dieselben Aktualisierungen informiert bleiben müssen. Zum Beispiel:

  • Gruppen-Chat-Anwendungen: Senden einer Nachricht an alle Teilnehmer in einem Chatroom.
  • Tools für die Zusammenarbeit: Informieren aller Benutzer über freigegebene Dokumente oder Inhaltsänderungen.
  • Live-Benachrichtigungen: Übertragen Sie aktuelle Nachrichten, Aktienaktualisierungen oder Sportergebnisse an mehrere Abonnenten.
  • Online-Gaming: Spielstatus oder Aktionen mehrerer Spieler synchronisieren.

In solchen Fällen stellt Broadcasting sicher, dass alle verbundenen Benutzer synchron bleiben, ohne dass für jeden Client individuelle Serveraufrufe erforderlich sind, die andernfalls ineffizient und anfällig für Latenz wären.


Zwei Ansätze zum Rundfunk

Bei der Umsetzung von Rundfunkübertragungen sind zwei gängige Strategien zu berücksichtigen:

  • Übertragung an alle Kunden (einschließlich des Absenders)
  • Übertragung an alle Kunden außer dem Absender

Broadcasting an alle Clients (einschließlich Absender)

Dieser Ansatz sendet die Nachricht an alle Clients, die mit einem bestimmten Kanal verbunden sind, einschließlich desjenigen, von dem die Nachricht stammt.

Dieser Ansatz eignet sich für Situationen, in denen jeder Kunde, einschließlich des Absenders, die Übertragung erhalten muss, beispielsweise um eine Bestätigung oder Aktualisierung seiner Nachricht in einem Gruppenchat anzuzeigen.

Broadcasting an alle Clients außer dem Absender

In diesem Fall wird die Nachricht an alle Clients gesendet, mit Ausnahme desjenigen, der sie gesendet hat.

Dieser Ansatz ist ideal für Szenarien, in denen der Absender seine eigene Nachricht nicht in der Übertragung sehen muss, wie zum Beispiel ein Multiplayer-Spiel, bei dem Aktionen mit anderen Spielern geteilt, aber nicht an denjenigen zurückgesendet werden müssen, der die Aktion ausführt .

Beide Methoden haben spezifische Anwendungsfälle und können einfach mit Tools wie Bun implementiert werden, sodass Entwickler die Übertragung effizient mit minimalem Code abwickeln können.


Dieser Artikel befasst sich mit der Einrichtung von WebSocket-Broadcasting mit Bun und demonstriert beide Broadcasting-Ansätze, die Ihnen beim Erstellen robuster Echtzeitanwendungen helfen.

Der Code für die Übertragung mit WebSockets

Im ersten Artikel dieser Serie, WebSocket mit JavaScript und Bun, haben wir die Struktur eines WebSocket-Servers untersucht, der auf von einem Client gesendete Nachrichten reagiert.

In diesem Artikel geht es um Kanalabonnements, einen Mechanismus, der das Senden von Nachrichten an mehrere Clients ermöglicht.

Wir beginnen mit der Präsentation des vollständigen Codes und zerlegen ihn dann, um alle relevanten Teile im Detail zu untersuchen.

Erstellen Sie die Datei „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
Nach dem Login kopieren
Nach dem Login kopieren

Sie können es ausführen über:

bun run broadcast.ts
Nach dem Login kopieren

Dieser Code führt Broadcasting ein und ermöglicht es dem Server, Nachrichten an alle abonnierten Clients in einem bestimmten Kanal zu senden. Es wird außerdem zwischen der Übertragung an alle Clients (einschließlich des Absenders) oder dem Ausschluss des Absenders unterschieden. Hier ist eine ausführliche Erklärung:


Initialisierung des Servers

const server = Bun.serve({
  port: 8080,
  ...
});
Nach dem Login kopieren

Die Initialisierung ist die gleiche wie im vorherigen Artikel.
Der Server überwacht Port 8080 und verarbeitet ähnlich wie im vorherigen Beispiel HTTP-Anfragen und aktualisiert WebSocket-Verbindungen für /chat.


Übertragung in WebSockets

Broadcasting ermöglicht das Senden einer Nachricht an alle Kunden, die einen bestimmten Kanal abonniert haben, z. B. einen Gruppenchat.
So erreicht der Code dies:


Abonnieren eines Kanals (im offenen Event)

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");
}
Nach dem Login kopieren
  • ws.subscribe(channel): abonniert den Client für den Kanal the-group-chat. Alle Clients in diesem Kanal können jetzt an ihn gesendete Nachrichten empfangen.
  • ws.send(...): Der Kunde wird individuell begrüßt.
  • ws.publish(channel, message): sendet eine Nachricht an alle Clients im Kanal.

Broadcasting-Nachrichten (Antworten/Rundsenden einer Nachricht von einem Client im Nachrichtenereignis)

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}`);
}
Nach dem Login kopieren

Wenn eine Nachricht von einem Kunden empfangen wird:

  • Der Absender erhält eine Bestätigung über ws.send(...).
  • Die Nachricht wird mit ws.publish(...) an alle Clients (mit Ausnahme des Absenders) im „Gruppenchat“ gesendet.

Hinweis: Der Absender erhält die Broadcast-Nachricht nicht, da wir die Veröffentlichungsmethode für das WS-Objekt aufrufen. Sie sollten das Serverobjekt verwenden, um den Absender einzuschließen.


Abmelden und Senden bei Trennung (im geschlossenen Fall)

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);
}
Nach dem Login kopieren

Wenn ein Client die Verbindung trennt:

  • ws.unsubscribe(channel): Entfernt den Client aus dem Kanalabonnement.
  • Eine Nachricht wird an alle verbleibenden Clients im Kanal gesendet, um sie über die Trennung zu informieren.

Regelmäßige Servernachrichten an alle Clients

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
Nach dem Login kopieren
Nach dem Login kopieren

Alle 5 Sekunden sendet der Server mithilfe von server.publish(...) eine Nachricht an alle Clients im Kanal „the-group-chat“. Hier verwenden wir das Serverobjekt.


Schlüsselmethoden

  • ws.subscribe(channel): abonniert den aktuellen WebSocket-Client für einen Kanal für die Gruppenkommunikation.
  • ws.publish(channel, message): sendet eine Nachricht an alle Clients im angegebenen Kanal (mit Ausnahme des Absenders).
  • server.publish(Kanal, Nachricht): ähnelt ws.publish, wird jedoch auf Serverebene zum Senden an alle abonnierten Clients (einschließlich des Absenders) verwendet.
  • ws.unsubscribe(channel): Entfernt den aktuellen Client aus dem Kanal.

Beispielablauf

  1. Ein Client stellt eine Verbindung zu /chat her und abonniert „the-group-chat“.
  2. Der Client sendet eine Nachricht an den Server:
    • Die Nachricht wird an den Absender zurückgesendet.
    • Der Server sendet die Nachricht an alle anderen Clients im Kanal.
  3. Wenn ein Client die Verbindung trennt:
    • Es wurde vom Kanal abgemeldet.
    • Der Server benachrichtigt die verbleibenden Clients über die Trennung.
  4. Alle 5 Sekunden sendet der Server eine periodische Broadcast-Nachricht an alle Clients.

Abschluss

WebSockets sind ein leistungsstarkes Tool zum Erstellen interaktiver Echtzeit-Webanwendungen. Im Gegensatz zur herkömmlichen HTTP-Kommunikation bieten WebSockets einen dauerhaften, bidirektionalen Kanal, der den sofortigen Nachrichtenaustausch zwischen dem Server und verbundenen Clients ermöglicht. Dies macht sie ideal für Szenarien wie Live-Chats, Tools für die Zusammenarbeit, Spiele oder alle Anwendungen, bei denen eine Kommunikation mit geringer Latenz von entscheidender Bedeutung ist.

In diesem Artikel (und in der Serie) haben wir die Grundlagen der Einrichtung eines WebSocket-Servers mit Bun, der Handhabung von Client-Verbindungen und der Übertragung von Nachrichten an abonnierte Clients untersucht. Wir haben auch gezeigt, wie man ein einfaches Gruppenchatsystem implementiert, bei dem Clients einem Kanal beitreten, Nachrichten senden und Updates sowohl von anderen Clients als auch vom Server selbst erhalten können.

Durch die Nutzung der integrierten WebSocket-Unterstützung und Funktionen wie Abonnieren, Veröffentlichen und Abmelden von Bun wird die Verwaltung der Echtzeitkommunikation bemerkenswert einfach. Unabhängig davon, ob Sie regelmäßige Updates senden, an alle Clients senden oder bestimmte Kanäle verwalten, bieten WebSockets eine effiziente und skalierbare Möglichkeit, solche Anforderungen zu erfüllen.

Das obige ist der detaillierte Inhalt vonWebSocket-Broadcasting mit JavaScript und Bun. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1677
14
PHP-Tutorial
1280
29
C#-Tutorial
1257
24
Python vs. JavaScript: Die Lernkurve und Benutzerfreundlichkeit Python vs. JavaScript: Die Lernkurve und Benutzerfreundlichkeit Apr 16, 2025 am 12:12 AM

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

JavaScript und das Web: Kernfunktionalität und Anwendungsfälle JavaScript und das Web: Kernfunktionalität und Anwendungsfälle Apr 18, 2025 am 12:19 AM

Zu den Hauptanwendungen von JavaScript in der Webentwicklung gehören die Interaktion der Clients, die Formüberprüfung und die asynchrone Kommunikation. 1) Dynamisches Inhaltsaktualisierung und Benutzerinteraktion durch DOM -Operationen; 2) Die Kundenüberprüfung erfolgt vor dem Einreichung von Daten, um die Benutzererfahrung zu verbessern. 3) Die Aktualisierung der Kommunikation mit dem Server wird durch AJAX -Technologie erreicht.

JavaScript in Aktion: Beispiele und Projekte in realer Welt JavaScript in Aktion: Beispiele und Projekte in realer Welt Apr 19, 2025 am 12:13 AM

Die Anwendung von JavaScript in der realen Welt umfasst Front-End- und Back-End-Entwicklung. 1) Zeigen Sie Front-End-Anwendungen an, indem Sie eine TODO-Listanwendung erstellen, die DOM-Operationen und Ereignisverarbeitung umfasst. 2) Erstellen Sie RESTFUFFUPI über Node.js und express, um Back-End-Anwendungen zu demonstrieren.

Verständnis der JavaScript -Engine: Implementierungsdetails Verständnis der JavaScript -Engine: Implementierungsdetails Apr 17, 2025 am 12:05 AM

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python vs. JavaScript: Entwicklungsumgebungen und Tools Python vs. JavaScript: Entwicklungsumgebungen und Tools Apr 26, 2025 am 12:09 AM

Sowohl Python als auch JavaScripts Entscheidungen in Entwicklungsumgebungen sind wichtig. 1) Die Entwicklungsumgebung von Python umfasst Pycharm, Jupyternotebook und Anaconda, die für Datenwissenschaft und schnelles Prototyping geeignet sind. 2) Die Entwicklungsumgebung von JavaScript umfasst Node.JS, VSCODE und WebPack, die für die Entwicklung von Front-End- und Back-End-Entwicklung geeignet sind. Durch die Auswahl der richtigen Tools nach den Projektbedürfnissen kann die Entwicklung der Entwicklung und die Erfolgsquote der Projekte verbessert werden.

Die Rolle von C/C bei JavaScript -Dolmetschern und Compilern Die Rolle von C/C bei JavaScript -Dolmetschern und Compilern Apr 20, 2025 am 12:01 AM

C und C spielen eine wichtige Rolle in der JavaScript -Engine, die hauptsächlich zur Implementierung von Dolmetschern und JIT -Compilern verwendet wird. 1) C wird verwendet, um JavaScript -Quellcode zu analysieren und einen abstrakten Syntaxbaum zu generieren. 2) C ist für die Generierung und Ausführung von Bytecode verantwortlich. 3) C implementiert den JIT-Compiler, optimiert und kompiliert Hot-Spot-Code zur Laufzeit und verbessert die Ausführungseffizienz von JavaScript erheblich.

Von Websites zu Apps: Die verschiedenen Anwendungen von JavaScript Von Websites zu Apps: Die verschiedenen Anwendungen von JavaScript Apr 22, 2025 am 12:02 AM

JavaScript wird in Websites, mobilen Anwendungen, Desktop-Anwendungen und serverseitigen Programmierungen häufig verwendet. 1) In der Website -Entwicklung betreibt JavaScript DOM zusammen mit HTML und CSS, um dynamische Effekte zu erzielen und Frameworks wie JQuery und React zu unterstützen. 2) Durch reaktnatives und ionisches JavaScript wird ein plattformübergreifendes mobile Anwendungen entwickelt. 3) Mit dem Elektronenframework können JavaScript Desktop -Anwendungen erstellen. 4) Node.js ermöglicht es JavaScript, auf der Serverseite auszuführen und unterstützt hohe gleichzeitige Anforderungen.

Python gegen JavaScript: Anwendungsfälle und Anwendungen verglichen Python gegen JavaScript: Anwendungsfälle und Anwendungen verglichen Apr 21, 2025 am 12:01 AM

Python eignet sich besser für Datenwissenschaft und Automatisierung, während JavaScript besser für die Entwicklung von Front-End- und Vollstapel geeignet ist. 1. Python funktioniert in Datenwissenschaft und maschinellem Lernen gut und unter Verwendung von Bibliotheken wie Numpy und Pandas für die Datenverarbeitung und -modellierung. 2. Python ist prägnant und effizient in der Automatisierung und Skripten. 3. JavaScript ist in der Front-End-Entwicklung unverzichtbar und wird verwendet, um dynamische Webseiten und einseitige Anwendungen zu erstellen. 4. JavaScript spielt eine Rolle bei der Back-End-Entwicklung durch Node.js und unterstützt die Entwicklung der Vollstapel.

See all articles