以下是一个可能的 Go 语言 WebSocket 服务端程序架构设计: ```go package main import ( "log" "net/http" "github.com/gorilla/websocket" ) // 定义一个全局的连接映射,键是用户 ID,值是 WebSocket 连接 var connections = make(map[string]*websocket.Conn) // 处理生产者的连接 func handleProducer(w http.ResponseWriter, r *http.Request) { upgrader := websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } conn, err := upgrader.Upgrade(w, r, nil) if err!= nil { log.Println("升级到 WebSocket 连接时出错:", err) return } defer conn.Close() for { // 从生产者接收消息 _, message, err := conn.ReadMessage() if err!= nil { log.Println("从生产者读取消息时出错:", err) return } // 将消息转发给所有消费者 for _, consumerConn := range connections { err := consumerConn.WriteMessage(websocket.TextMessage, message) if err!= nil { log.Println("向消费者发送消息时出错:", err) continue } } } } // 处理消费者的连接 func handleConsumer(w http.ResponseWriter, r *http.Request) { upgrader := websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } conn, err := upgrader.Upgrade(w, r, nil) if err!= nil { log.Println("升级到 WebSocket 连接时出错:", err) return } defer conn.Close() // 将消费者的连接添加到映射中 connections[conn.RemoteAddr().String()] = conn } func main() { http.HandleFunc("/ws/command", handleProducer) http.HandleFunc("/ws/push", handleConsumer) log.Fatal(http.ListenAndServe(":8080", nil)) } ``` 额外需要注意的逻辑点: 1. 错误处理需要更详细和全面,比如在连接建立、消息读写等操作中。 2. 考虑添加心跳机制来检测连接的有效性。 3. 对并发读写连接映射需要进行适当的同步控制,以避免并发问题。 [2025-02-25 09:20:32 | AI写代码神器 | 559点数解答]