Rumah >pembangunan bahagian belakang >Golang >Demo Aplikasi Web Masa Nyata dengan WebSocket - Backend

Demo Aplikasi Web Masa Nyata dengan WebSocket - Backend

Patricia Arquette
Patricia Arquetteasal
2024-12-30 11:52:141020semak imbas

Real-Time Web Application demo with WebSocket - Backend

pengenalan

Dalam artikel ini, saya akan meneroka pelaksanaan bahagian belakang aplikasi WebSocket masa nyata saya. Dibina menggunakan Gin dan Go, bahagian belakang mengurus sambungan WebSocket dengan cekap, menyimpan mesej dan menyiarkan kemas kini kepada semua pelanggan yang disambungkan.


Struktur Projek

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

Projek bahagian belakang saya dianjurkan untuk memastikan modulariti dan kebolehgunaan semula. Di bawah ialah struktur direktori yang dikemas kini:

./backend
├── go.mod
├── go.sum
├── main.go
└── stores
    └── messages.go

Direktori dan Fail Utama

  • go.mod: Mentakrifkan kebergantungan modul dan versi.
  • main.go: Titik masuk aplikasi yang memulakan pelayan dan laluan WebSocket.
  • stores/messages.go: Mengurus storan mesej dengan operasi selamat benang.

Komponen Teras: main.go

main.go ialah titik masuk utama untuk aplikasi pelayan WebSocket saya. Ia menyediakan penghala Gin, mentakrifkan laluan WebSocket dan mengendalikan kitaran hayat WebSocket.

Panduan Kod

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")
}

Fungsi Utama

  1. Pengurusan Negeri: Menjejaki pelanggan yang disambungkan dan memastikan akses selamat benang menggunakan mutex.
  2. Kitaran HayatWebSocket: Mengendalikan persediaan sambungan, penyiaran mesej dan pembersihan apabila diputuskan sambungan.

Kesimpulan

Pelaksanaan bahagian belakang aplikasi demo WebSocket saya menunjukkan cara mengurus komunikasi masa nyata dengan berkesan menggunakan Gin dan Go. Dengan memanfaatkan WebSocket untuk sambungan berterusan dan kedai mesej selamat benang, aplikasi ini berfungsi sebagai asas yang kukuh untuk membina aplikasi web masa nyata.

Dalam artikel seterusnya, saya akan membincangkan strategi penggunaan dan mengoptimumkan prestasi WebSocket.


Pautan ke Siri

  • Demo Aplikasi Web Masa Nyata dengan WebSocket - Gambaran Keseluruhan
  • Demo Aplikasi Web Masa Nyata dengan WebSocket - Frontend

Atas ialah kandungan terperinci Demo Aplikasi Web Masa Nyata dengan WebSocket - Backend. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn