pkg/websocket 封装 gorilla/websocket,提供连接对象、心跳管理与 Hub/房间广播能力。
WebSocketHub 管理连接、私发、广播与房间。type WebSocket
ID() / UserID()Read / ReadText / ReadJSONWrite / WriteText / WriteJSON / WriteBinaryPing() / Close() / IsClosed()StartPingPong()type WebSocketHub
NewWebSocketHub()Register / UnregisterGet / GetAll / CountBroadcast / BroadcastTextSend / SendTextJoinRoom / LeaveRoomBroadcastToRoom / BroadcastTextToRoomGetRoomMembers / RoomCount / GetRooms / IsInRoomtype WSOptiontype MessageNewTextMessage(msgType, data)ErrConnectionNotFoundErrRoomNotFoundErrInvalidMessageTypeWithWSPingInterval(interval):默认 54sWithWSPongTimeout(timeout):默认 60sWithWSMaxMessageSize(size):默认 512KBWithWSReadBufferSize(size):默认 1024WithWSWriteBufferSize(size):默认 1024WithWSCheckOrigin(fn):自定义来源校验WithWSAllowAllOrigins():允许所有来源,不建议生产环境使用ws, err := c.UpgradeWebSocket("user-1")
if err != nil {
return
}
defer ws.Close()
go ws.StartPingPong()
for {
msg, err := ws.ReadText()
if err != nil {
break
}
_ = ws.WriteText("echo: " + msg)
}
hub := websocket.NewWebSocketHub()
hub.Register(ws)
defer hub.Unregister(ws)
_ = hub.JoinRoom(ws.UserID(), "room-1")
_ = hub.BroadcastToRoom("room-1", map[string]any{"type": "notice"})
Context.UpgradeWebSocket(userID, opts...) 直接完成 HTTP → WebSocket 升级。WebSocketHub 管理。r.GET("/ws", func(c *gin.Context) {
ws, err := c.UpgradeWebSocket("user-1", websocket.WithWSPongTimeout(30*time.Second))
if err != nil {
return
}
hub.Register(ws)
})