Heim > Backend-Entwicklung > Golang > Echtzeit-Webanwendungsdemo mit WebSocket – Backend

Echtzeit-Webanwendungsdemo mit WebSocket – Backend

Patricia Arquette
Freigeben: 2024-12-30 11:52:14
Original
1017 Leute haben es durchsucht

Real-Time Web Application demo with WebSocket - Backend

Einführung

In diesem Artikel werde ich die Backend-Implementierung meiner Echtzeit-WebSocket-Anwendung untersuchen. Das mit Gin and Go erstellte Backend verwaltet effizient WebSocket-Verbindungen, speichert Nachrichten und sendet Aktualisierungen an alle verbundenen Clients.


Projektstruktur

https://github.com/tom-takeru/web-socket-demo

Mein Backend-Projekt ist so organisiert, dass Modularität und Wiederverwendbarkeit gewährleistet sind. Nachfolgend finden Sie die aktualisierte Verzeichnisstruktur:

./backend
├── go.mod
├── go.sum
├── main.go
└── stores
    └── messages.go
Nach dem Login kopieren

Wichtige Verzeichnisse und Dateien

  • go.mod: Definiert Modulabhängigkeiten und -versionen.
  • main.go: Einstiegspunkt der Anwendung, die den WebSocket-Server und die Routen initialisiert.
  • stores/messages.go: Verwaltet den Nachrichtenspeicher mit Thread-sicheren Vorgängen.

Kernkomponente: main.go

main.go ist der Haupteinstiegspunkt für meine WebSocket-Serveranwendung. Es richtet den Gin-Router ein, definiert die WebSocket-Route und verwaltet den WebSocket-Lebenszyklus.

Code-Komplettlösung

package main

import (
    "encoding/json"
    "net/http"
    "sync"
    "time"

    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"

    "github.com/tom-takeru/web-socket-demo/backend/stores"
)

var (
    upgrader = websocket.Upgrader{
        CheckOrigin: func(r *http.Request) bool {
            origin := r.Header.Get("Origin")
            // NOTE: This project is for local development only.
            return origin == "http://localhost:3000"
        },
    }
    messageStore = stores.NewMessageStore()
    clients      = make(map[*websocket.Conn]bool)
    clientsMu    sync.Mutex
)

func handleWebSocket(c *gin.Context) {
    conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to upgrade to WebSocket"})
        return
    }
    defer conn.Close()

    clientsMu.Lock()
    clients[conn] = true
    clientsMu.Unlock()

    // Send existing messages to the new connection
    for _, msg := range messageStore.MarshalMessages() {
        conn.WriteMessage(websocket.TextMessage, msg)
    }

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            break
        }

        var msgData map[string]string
        if err := json.Unmarshal(message, &msgData); err != nil {
            break
        }

        timestamp := time.Now().Format(time.RFC3339)
        msgData["timestamp"] = timestamp

        messageStore.AddMessage(msgData)

        modifiedMessage, err := json.Marshal(msgData)
        if err != nil {
            break
        }

        clientsMu.Lock()
        for client := range clients {
            if err := client.WriteMessage(websocket.TextMessage, modifiedMessage); err != nil {
                client.Close()
                delete(clients, client)
            }
        }
        clientsMu.Unlock()
    }

    clientsMu.Lock()
    delete(clients, conn)
    clientsMu.Unlock()
}

func main() {
    r := gin.Default()
    r.GET("/ws", handleWebSocket)
    r.Run("localhost:8080")
}
Nach dem Login kopieren

Schlüsselfunktionen

  1. Statusverwaltung: Verfolgt verbundene Clients und gewährleistet threadsicheren Zugriff mithilfe eines Mutex.
  2. WebSocket-Lebenszyklus: Verwaltet den Verbindungsaufbau, die Nachrichtenübertragung und die Bereinigung bei Verbindungstrennung.

Abschluss

Die Backend-Implementierung meiner WebSocket-Demoanwendung zeigt, wie man Echtzeitkommunikation mit Gin and Go effektiv verwaltet. Durch die Nutzung von WebSocket für dauerhafte Verbindungen und einen Thread-sicheren Nachrichtenspeicher dient diese Anwendung als robuste Grundlage für die Erstellung von Echtzeit-Webanwendungen.

Im nächsten Artikel werde ich Bereitstellungsstrategien und die Optimierung der WebSocket-Leistung besprechen.


Links zur Serie

  • Echtzeit-Webanwendungsdemo mit WebSocket – Übersicht
  • Echtzeit-Webanwendungsdemo mit WebSocket – Frontend

Das obige ist der detaillierte Inhalt vonEchtzeit-Webanwendungsdemo mit WebSocket – Backend. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage