Rumah >pembangunan bahagian belakang >Golang >Demo Aplikasi Web Masa Nyata dengan WebSocket - Backend
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.
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
main.go ialah titik masuk utama untuk aplikasi pelayan WebSocket saya. Ia menyediakan penghala Gin, mentakrifkan laluan WebSocket dan mengendalikan kitaran hayat 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") }
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.
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!