我们使用golang构建websocket,支持高性能、高并发,websocket不用多介绍,go自带原生websocketapi,但有些断线重连、信息发送处理不太完善,我们改造gorilla/websocket 用于我们的系统,源码在文章末尾,以下是两个扩展的对比信息。
Gorilla WebSocket compared with other packages
| RFC 6455 Features | ||
| No | ||
| Receive fragmented message | Yes | No, see note 1 | 
| Send close message | ||
| Send pings and receive pongs | No | |
| Get the type of a received data message | Yes | Yes, see note 2 | 
| Other Features | ||
| Experimental | No | |
| Read message using io.Reader | No, see note 3 | |
| Write message using io.WriteCloser | No, see note 3 | |
注册client
首先我们定义client相关的struct 用于注册进我们的服务,其中注册和反注册 我们使用channel构造
type Client struct {
    hub *GatewayInfo
    // The websocket connection.
    conn *websocket.Conn
    // Buffered channel of outbound messages.
    send chan []byte
    Id string
    Num int
    Info ClientInfo
}
type GatewayInfo struct {
    // Registered clients.
    clients sync.Map
    // Register requests from the clients.
    register chan *Client
    // Unregister requests from clients.
    unregister chan *Client
}
启动服务 http升级为ws
```
// serveWs handles websocket requests from the peer.
func ServeWs(hub *GatewayInfo, w http.ResponseWriter, r *http.Request) {
    upgrader.CheckOrigin = func(r *http.Request) bool {
        return true
    }
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return