この記事では、リアルタイム WebSocket アプリケーションのバックエンド実装について説明します。 Gin と Go を使用して構築されたバックエンドは、WebSocket 接続を効率的に管理し、メッセージを保存し、接続されているすべてのクライアントに更新をブロードキャストします。
https://github.com/tom-takeru/web-socket-demo
私のバックエンド プロジェクトは、モジュール性と再利用性を確保するように編成されています。以下は更新されたディレクトリ構造です:
./backend ├── go.mod ├── go.sum ├── main.go └── stores └── messages.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") }
私の WebSocket デモ アプリケーションのバックエンド実装は、Gin と Go を使用してリアルタイム通信を効果的に管理する方法を示しています。永続的な接続とスレッドセーフなメッセージ ストアに WebSocket を活用することにより、このアプリケーションはリアルタイム Web アプリケーションを構築するための堅牢な基盤として機能します。
次の記事では、展開戦略と WebSocket パフォーマンスの最適化について説明します。
以上がWebSocket を使用したリアルタイム Web アプリケーションのデモ - バックエンドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。