游戏服务器不用net/http因HTTP协议不适合高频实时通信应直接用net.Conn或WebSocket需精细控制连接生命周期、避免goroutine泄漏并用sync.Mapsync.Pool优化性能。为什么不用 net/http 直接写游戏服务器HTTP 协议本身有请求-响应模型、头部开销、连接复用限制不适合高频小包、长连接、双向实时通信的场景。游戏服务器要扛住上万 TCP 连接并低延迟收发帧net/http 的 handler 机制会成为瓶颈且无法控制底层连接生命周期。每次 HTTP 请求都要解析 headers、body、method而游戏协议通常只传几个字节的二进制包http.Server 默认启用 keep-alive 和 TLS 握手复用但游戏客户端往往自己管理心跳和重连反而需要更轻量的裸 TCP 或 WebSocket 接口goroutine 调度压力大HTTP server 对每个请求起 goroutine但游戏里一个连接要持续读写多年不能按“请求”粒度调度用 net.Conn 写 TCP 长连接服务的关键三步绕过框架直面 net.Conn 是最常见也最可控的做法。核心不是“怎么监听”而是“怎么不崩”。监听用 net.Listen(tcp, :3000)但必须配合 SetReadDeadline 和 SetWriteDeadline否则死连接或慢客户端会卡住 goroutine每个连接单独起 goroutine 处理读conn.Read再用 channel 或 sync.Map 把消息推给逻辑层写操作建议统一走一个 goroutine select channel避免并发写 panic务必检查 io.EOF 和 net.ErrClosed而不是只看 err ! nil——很多“连接断了但没报错”其实是对方静默关闭得靠读到 0 字节判断for { n, err : conn.Read(buf[:]) if n 0 || errors.Is(err, io.EOF) || errors.Is(err, net.ErrClosed) { break // 客户端下线 } if err ! nil { if !errors.Is(err, net.ErrTimeout) { log.Printf(read error: %v, err) } continue } // 解包、路由、处理...}golang.org/x/net/websocket 已废弃现在该用什么别碰旧的 websocket 包它不支持 RFC 6455 完整特性也没有 ping/pong 自动处理。生产环境推荐两个选择 文心快码 文心快码Comate是百度推出的一款AI辅助编程工具