Maison >développement back-end >Golang >Implémentation de la communication WebSocket et du mécanisme de battement de cœur avec GoFrame : un guide pratique
Dans le développement Web moderne, la communication en temps réel est devenue de plus en plus cruciale. WebSocket s'impose comme la technologie incontournable pour la mise en œuvre d'une communication bidirectionnelle entre clients et serveurs. Ce guide vous guidera dans la mise en œuvre de la communication WebSocket et d'un mécanisme de battement de cœur robuste à l'aide de GoFrame.
Commençons par créer un serveur WebSocket de base :
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() }
Cela crée un simple serveur d'écho qui écoute sur le port 8399 et renvoie tous les messages qu'il reçoit.
Voici une implémentation de base d'un client 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>
Dans un environnement de production, vous devrez gérer efficacement plusieurs connexions. Voici comment mettre en place un pool de connexions :
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) } }
Voici une implémentation de battement de coeur prête pour la production :
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>
Avec la prise en charge WebSocket de GoFrame, vous pouvez facilement mettre en œuvre une communication robuste en temps réel dans vos applications. La combinaison d'une gestion appropriée des connexions, de mécanismes de battement de cœur et d'une gestion simultanée des connexions garantit une implémentation WebSocket fiable et évolutive.
N'oubliez pas de :
Vous disposez désormais d'une base solide pour implémenter la communication WebSocket dans vos applications GoFrame. Bon codage ! ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!