WebSocket support and implementation methods in the Gin framework are as follows:
1. WebSocket basics
Gin does not directly support WebSocket, but WebSocket functionality can be implemented by integrating third-party libraries. Common libraries include:
- gorilla/websocket: The most popular Go WebSocket library
- gobwas/ws: High-performance WebSocket library
2. Implementation using gorilla/websocket
2.1 Install dependencies
bashgo get github.com/gorilla/websocket
2.2 Create WebSocket upgrader
govar upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { // Allow all origins, should be restricted in production return true }, }
2.3 WebSocket handler function
gofunc handleWebSocket(c *gin.Context) { // Upgrade HTTP connection to WebSocket conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { log.Printf("WebSocket upgrade error: %v", err) return } defer conn.Close() // Handle WebSocket connection for { // Read message messageType, message, err := conn.ReadMessage() if err != nil { log.Printf("Read error: %v", err) break } log.Printf("Received: %s", message) // Send response err = conn.WriteMessage(messageType, []byte("Echo: "+string(message))) if err != nil { log.Printf("Write error: %v", err) break } } }
2.4 Register WebSocket route
gofunc main() { r := gin.Default() r.GET("/ws", handleWebSocket) r.Run(":8080") }
3. WebSocket manager
3.1 Create connection manager
gotype Client struct { Conn *websocket.Conn Send chan []byte } type Hub struct { clients map[*Client]bool broadcast chan []byte register chan *Client unregister chan *Client } var hub = Hub{ clients: make(map[*Client]bool), broadcast: make(chan []byte), register: make(chan *Client), unregister: make(chan *Client), } func (h *Hub) Run() { for { select { case client := <-h.register: h.clients[client] = true case client := <-h.unregister: if _, ok := h.clients[client]; ok { delete(h.clients, client) close(client.Send) } case message := <-h.broadcast: for client := range h.clients { select { case client.Send <- message: default: close(client.Send) delete(h.clients, client) } } } } }
3.2 Client handling
gofunc (c *Client) readPump() { defer func() { hub.unregister <- c c.Conn.Close() }() for { _, message, err := c.Conn.ReadMessage() if err != nil { break } hub.broadcast <- message } } func (c *Client) writePump() { defer c.Conn.Close() for { select { case message, ok := <-c.Send: if !ok { return } err := c.Conn.WriteMessage(websocket.TextMessage, message) if err != nil { return } } } }
4. Real-time chat example
4.1 Chat room handler
gofunc handleChat(c *gin.Context) { conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { log.Printf("WebSocket upgrade error: %v", err) return } client := &Client{ Conn: conn, Send: make(chan []byte, 256), } hub.register <- client go client.writePump() go client.readPump() }
4.2 Broadcast message
gofunc broadcastMessage(message string) { hub.broadcast <- []byte(message) }
5. WebSocket authentication
5.1 Token authentication
gofunc authMiddleware() gin.HandlerFunc { return func(c *gin.Context) { token := c.Query("token") if token == "" { c.JSON(401, gin.H{"error": "Unauthorized"}) c.Abort() return } // Validate token if !validateToken(token) { c.JSON(401, gin.H{"error": "Invalid token"}) c.Abort() return } c.Next() } } // Use authentication middleware r.GET("/ws", authMiddleware(), handleWebSocket)
6. Heartbeat detection
6.1 Implement Ping/Pong
gofunc handleWebSocketWithPing(c *gin.Context) { conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { return } defer conn.Close() // Set Pong handler conn.SetPongHandler(func(string) error { log.Println("Received pong") return nil }) ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() done := make(chan struct{}) go func() { defer close(done) for { _, _, err := conn.ReadMessage() if err != nil { return } } }() for { select { case <-ticker.C: // Send Ping err := conn.WriteMessage(websocket.PingMessage, []byte{}) if err != nil { return } case <-done: return } } }
7. Best practices
-
Connection management
- Use connection pool to manage multiple WebSocket connections
- Implement heartbeat detection to prevent connection disconnection
- Provide graceful connection shutdown mechanism
-
Message handling
- Use message queues to handle high-concurrency messages
- Implement message acknowledgment mechanism
- Handle message serialization and deserialization
-
Security
- Implement WebSocket authentication and authorization
- Use WSS (WebSocket Secure) for encrypted connections
- Limit connection frequency and message size
-
Performance optimization
- Use buffered channels to reduce blocking
- Implement message compression
- Reasonably set read/write buffer sizes
-
Error handling
- Log connection errors and message errors
- Implement automatic reconnection mechanism
- Provide error recovery strategies
Through the above methods, you can implement fully functional WebSocket applications in the Gin framework.