WebSocket in Go: Entwicklung von Echtzeit-Anwendungen von Grund auf

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

WebSocket auf Go: Erstellung von Echtzeit-Anwendungen



Moderne Webanwendungen erfordern zunehmend eine sofortige Datenübertragung zwischen Client und Server. Traditionelle HTTP-Anfragen mit ihrem „Anfrage-Antwort“-Zyklus sind für Aufgaben, bei denen Geschwindigkeit wichtig ist, nicht geeignet: Online-Chats, Börsenkurse, Multiplayer-Spiele oder Echtzeit-Benachrichtigungen. Hier kommt WebSocket ins Spiel – ein Protokoll, das eine dauerhafte bidirektionale Verbindung ermöglicht. In diesem Artikel werden wir uns ansehen, wie man WebSocket auf Go (Golang) implementiert, vom einfachen Server bis hin zu einer vollwertigen Echtzeit-Anwendung.



Was ist WebSocket und warum Go?



WebSocket ist ein Protokoll auf Basis von TCP, das eine dauerhafte Verbindung zwischen Client (Browser) und Server herstellt. Nach dem Handshake werden Daten in beide Richtungen ohne zusätzliche HTTP-Header übertragen, was die Latenzzeiten erheblich reduziert.



Warum Go? Die Sprache Go ist ideal für WebSocket-Server geeignet, dank der integrierten Unterstützung für Nebenläufigkeit (Goroutinen und Kanäle), hoher Leistung und Einfachheit beim Schreiben von Netzwerkcode. Im Gegensatz zu Node.js benötigt Go keine externen Ereignisschleifen, und seine kompilierte Natur bietet einen Geschwindigkeitsvorteil.



Einfacher WebSocket-Server auf Go



Für die Arbeit mit WebSocket in Go verwenden wir die beliebte Bibliothek gorilla/websocket. Sie bietet eine praktische API und kümmert sich um die Details des Protokolls.



Installieren Sie die Bibliothek:

go get github.com/gorilla/websocket


Jetzt schreiben wir einen einfachen Echo-Server, der alles, was er vom Client erhält, zurücksendet.



package main

import ( "log" "net/http" "github.com/gorilla/websocket")

var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // Für die Entwicklung. In der Produktion Origin prüfen. },}

func echoHandler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("Upgrade fehlgeschlagen:", err) return } defer conn.Close()

for { messageType, message, err := conn.ReadMessage() if err != nil { log.Println("Lesefehler:", err) break } log.Printf("Empfangen: %s", message)

if err := conn.WriteMessage(messageType, message); err != nil { log.Println("Schreibfehler:", err) break } }}

func main() { http.HandleFunc("/ws", echoHandler) log.Println("Server gestartet auf :8080") log.Fatal(http.ListenAndServe(":8080", nil))}


Erklärung des Codes:

  • Upgrader – ein Objekt, das die HTTP-Verbindung zu WebSocket „heraufstuft“.
  • CheckOrigin – Funktion zur Überprüfung der Anfragenquelle. In der Produktion unbedingt konfigurieren.
  • conn.ReadMessage() und conn.WriteMessage() – die Hauptmethoden zum Lesen/Schreiben von Nachrichten.
  • Die for-Schleife hält die Verbindung offen, bis ein Fehler auftritt.


Architektur eines Echtzeit-Chats mit WebSocket



Der Echo-Server ist die Basis, aber für eine Echtzeit-Anwendung, wie z.B. einen Chat, ist eine komplexere Logik erforderlich. Betrachten wir eine Architektur, bei der mehrere Clients über den Server Nachrichten austauschen können.



Hauptkomponenten:

  • Hub – der zentrale Manager, der eine Liste der aktiven Verbindungen speichert.
  • Client – eine Struktur, die eine einzelne WebSocket-Verbindung repräsentiert.
  • Kanäle (channels) – für die sichere Datenübertragung zwischen Goroutinen.


package main

import ( "log" "net/http" "github.com/gorilla/websocket")

var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true },}

// Clien

Blogs

Buchempfehlungen