ホームページ > バックエンド開発 > Golang > WebSocket を使用したリアルタイム Web アプリケーションのデモ - バックエンド

WebSocket を使用したリアルタイム Web アプリケーションのデモ - バックエンド

Patricia Arquette
リリース: 2024-12-30 11:52:14
オリジナル
1017 人が閲覧しました

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート