ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Go-WebSocket实时通信从聊天室到消息推送系统实战

2026/8/21 10:45:15 拓冰建站 浏览量
Go-WebSocket实时通信从聊天室到消息推送系统实战 Go-WebSocket实时通信从聊天室到消息推送系统实战文章导语WebSocket是实现实时双向通信的利器。在Go中goroutine-per-connection模型与WebSocket天然契合。本文基于gorilla/websocket库实现从基础聊天室到生产级消息推送系统。一、WebSocket基础服务importgithub.com/gorilla/websocketvarupgraderwebsocket.Upgrader{ReadBufferSize:1024,WriteBufferSize:1024,CheckOrigin:func(r*http.Request)bool{returntrue// 生产环境需要校验Origin},}funchandleWebSocket(w http.ResponseWriter,r*http.Request){conn,err:upgrader.Upgrade(w,r,nil)iferr!nil{log.Print(升级失败:,err)return}deferconn.Close()for{messageType,msg,err:conn.ReadMessage()iferr!nil{break}// Echo回复conn.WriteMessage(messageType,msg)}}二、聊天室Hub模式typeHubstruct{clientsmap[*Client]boolbroadcastchan[]byteregisterchan*Client unregisterchan*Client mu sync.RWMutex}func(h*Hub)Run(){for{select{caseclient:-h.register:h.mu.Lock()h.clients[client]trueh.mu.Unlock()caseclient:-h.unregister:h.mu.Lock()if_,ok:h.clients[client];ok{delete(h.clients,client)close(client.send)}h.mu.Unlock()casemessage:-h.broadcast:h.mu.RLock()forclient:rangeh.clients{select{caseclient.send-message:default:close(client.send)delete(h.clients,client)}}h.mu.RUnlock()}}}三、心跳保活func(c*Client)ReadPump(hub*Hub){deferfunc(){hub.unregister-c c.conn.Close()}()c.conn.SetReadDeadline(time.Now().Add(pongWait))c.conn.SetPongHandler(func(string)error{c.conn.SetReadDeadline(time.Now().Add(pongWait))returnnil})for{_,msg,err:c.conn.ReadMessage()iferr!nil{break}hub.broadcast-msg}}func(c*Client)WritePump(){ticker:time.NewTicker(pingPeriod)deferfunc(){ticker.Stop()c.conn.Close()}()for{select{casemsg,ok:-c.send:if!ok{return}c.conn.WriteMessage(websocket.TextMessage,msg)case-ticker.C:c.conn.WriteMessage(websocket.PingMessage,nil)}}}四、全文总结Hub模式管理所有连接实现广播推送Ping/Pong心跳保持长连接活跃读写分离通过两个goroutine实现全双工连接数限制通过channel信号量控制参考文献gorilla/websocket: https://github.com/gorilla/websocketWebSocket RFC 6455Go Blog - Advanced Go Concurrency Patterns