在現代 Web 開發中,即時通訊變得越來越重要。 WebSocket 是實現客戶端和伺服器之間雙向通訊的首選技術。本指南將引導您使用 GoFrame 實作 WebSocket 通訊和強大的心跳機制。
讓我們從建立一個基本的 WebSocket 伺服器開始:
package main import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gctx" ) func main() { ctx := gctx.New() s := g.Server() s.BindHandler("/ws", func(r *ghttp.Request) { ws, err := r.WebSocket() if err != nil { g.Log().Error(ctx, err) return } defer ws.Close() for { msgType, msg, err := ws.ReadMessage() if err != nil { return } if err = ws.WriteMessage(msgType, msg); err != nil { return } } }) s.SetPort(8399) s.Run() }
這將建立一個簡單的回顯伺服器,該伺服器偵聽連接埠 8399 並回顯它收到的任何訊息。
這是一個基本的 HTML/JavaScript 用戶端實作:
<!DOCTYPE html> <html> <head> <title>WebSocket Client</title> </head> <body> <script> const socket = new WebSocket('ws://localhost:8399/ws'); socket.onopen = function(e) { console.log('Connection established'); socket.send('Hello, server!'); }; socket.onmessage = function(event) { console.log('Message received:', event.data); }; socket.onclose = function(event) { console.log('Connection closed'); }; </script> </body> </html>
在生產環境中,您需要有效地處理多個連線。以下是如何實現連線池:
import "github.com/gogf/gf/v2/os/gmlock" var ( connPool = make(map[string]*ghttp.WebSocket) mu = gmlock.New() ) func addConn(id string, ws *ghttp.WebSocket) { mu.Lock() connPool[id] = ws mu.Unlock() } func removeConn(id string) { mu.Lock() delete(connPool, id) mu.Unlock() } func broadcastMessage(ctx context.Context, id string, message []byte) { mu.RLock(id) defer mu.RUnlock(id) for _, ws := range connPool { go func(ws *ghttp.WebSocket) { if err := ws.WriteMessage(websocket.TextMessage, message); err != nil { g.Log().Error(ctx, err) } }(ws) } }
這是一個生產就緒的心跳實現:
package main import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gctx" ) func main() { ctx := gctx.New() s := g.Server() s.BindHandler("/ws", func(r *ghttp.Request) { ws, err := r.WebSocket() if err != nil { g.Log().Error(ctx, err) return } defer ws.Close() for { msgType, msg, err := ws.ReadMessage() if err != nil { return } if err = ws.WriteMessage(msgType, msg); err != nil { return } } }) s.SetPort(8399) s.Run() }
<!DOCTYPE html> <html> <head> <title>WebSocket Client</title> </head> <body> <script> const socket = new WebSocket('ws://localhost:8399/ws'); socket.onopen = function(e) { console.log('Connection established'); socket.send('Hello, server!'); }; socket.onmessage = function(event) { console.log('Message received:', event.data); }; socket.onclose = function(event) { console.log('Connection closed'); }; </script> </body> </html>
借助 GoFrame 的 WebSocket 支持,您可以輕鬆在應用程式中實現強大的即時通訊。正確的連接處理、心跳機制和並發連接管理的組合確保了可靠且可擴展的 WebSocket 實作。
記住:
現在您已經為在 GoFrame 應用程式中實作 WebSocket 通訊奠定了堅實的基礎。快樂編碼! ?
以上是使用 GoFrame 實作 WebSocket 通訊和心跳機制:實作指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!