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