Home >Backend Development >Golang >Implementing WebSocket Communication and Heartbeat Mechanism with GoFrame: A Hands-on Guide
In modern web development, real-time communication has become increasingly crucial. WebSocket stands out as the go-to technology for implementing bidirectional communication between clients and servers. This guide will walk you through implementing WebSocket communication and a robust heartbeat mechanism using GoFrame.
Let's start by creating a basic WebSocket server:
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() }
This creates a simple echo server that listens on port 8399 and echoes back any messages it receives.
Here's a basic HTML/JavaScript client implementation:
<!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>
In a production environment, you'll need to handle multiple connections efficiently. Here's how to implement a connection pool:
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) } }
Here's a production-ready heartbeat implementation:
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>
With GoFrame's WebSocket support, you can easily implement robust real-time communication in your applications. The combination of proper connection handling, heartbeat mechanisms, and concurrent connection management ensures a reliable and scalable WebSocket implementation.
Remember to:
Now you have a solid foundation for implementing WebSocket communication in your GoFrame applications. Happy coding! ?
The above is the detailed content of Implementing WebSocket Communication and Heartbeat Mechanism with GoFrame: A Hands-on Guide. For more information, please follow other related articles on the PHP Chinese website!