首頁 >後端開發 >Golang >使用 WebSocket 的即時 Web 應用程式演示 - 後端

使用 WebSocket 的即時 Web 應用程式演示 - 後端

Patricia Arquette
Patricia Arquette原創
2024-12-30 11:52:141020瀏覽

Real-Time Web Application demo with WebSocket - Backend

介紹

在本文中,我將探索即時 WebSocket 應用程式的後端實作。使用 Gin 和 Go 建置的後端可以有效管理 WebSocket 連線、儲存訊息並向所有連線的用戶端廣播更新。


專案結構

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

我的後端專案的組織方式是為了確保模組化和可重複使用性。以下是更新後的目錄結構:

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

關鍵目錄和文件

  • go.mod:定義模組依賴項和版本。
  • main.go:初始化 WebSocket 伺服器和路由的應用程式入口點。
  • stores/messages.go:透過執行緒安全操作管理訊息儲存。

核心組件:main.go

main.go 是我的 WebSocket 伺服器應用程式的主要入口點。它設定 Gin 路由器,定義 WebSocket 路由,並處理 WebSocket 生命週期。

代碼演練

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

關鍵功能

  1. 狀態管理:追蹤連線的客戶端並使用互斥體確保執行緒安全存取。
  2. WebSocket 生命週期:處理連線設定、訊息廣播和斷開連線時的清理。

結論

我的 WebSocket 示範應用程式的後端實作示範如何使用 Gin 和 Go 有效管理即時通訊。透過利用 WebSocket 實現持久連接和線程安全訊息存儲,該應用程式為建立即時 Web 應用程式奠定了堅實的基礎。

在下一篇文章中,我將討論部署策略和最佳化 WebSocket 效能。


系列連結

  • 使用 WebSocket 的即時 Web 應用程式演示 - 概述
  • 使用 WebSocket 的即時 Web 應用程式演示 - 前端

以上是使用 WebSocket 的即時 Web 應用程式演示 - 後端的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn