package nnet import ( "crypto/tls" "git.noahlan.cn/noahlan/nnet/config" "git.noahlan.cn/noahlan/nnet/conn" "git.noahlan.cn/noahlan/ntool/nlog" "github.com/gorilla/websocket" "github.com/jpillora/backoff" "net/http" "time" ) // DialWebsocket websocket方式 连接服务器 func (ngin *Engine) DialWebsocket(url string, conf config.WSClientFullConf, evtOpts ...WsEventOption) (*conn.Connection, error) { for _, opt := range evtOpts { opt(conf.WSEvent) } ngin.ReadDeadline = conf.ReadDeadline ngin.WriteDeadline = conf.WriteDeadline err := ngin.setup() if err != nil { nlog.Errorf("%s failed to setup server, err:%v", ngin.LogPrefix(), err) return nil, err } dialer := websocket.Dialer{ TLSClientConfig: &tls.Config{ InsecureSkipVerify: true, }, HandshakeTimeout: conf.HandshakeTimeout, ReadBufferSize: conf.ReadBufferSize, WriteBufferSize: conf.WriteBufferSize, EnableCompression: conf.Compression, } // 连接重试 b := &backoff.Backoff{ Factor: conf.RecFactor, Jitter: true, Min: conf.MinRecTime, Max: conf.MaxRecTime, } var wsConn *websocket.Conn for { nextRec := b.Duration() wsConn, _, err = dialer.Dial(url, http.Header{}) if err != nil { ngin.evtMgr.OnConnectError(err) time.Sleep(nextRec) continue } if conf.ReadLimit != 0 { wsConn.SetReadLimit(conf.ReadLimit) } break } nlog.Infof("%s now connect to %s...", ngin.LogPrefix(), url) return ngin.handleWS(wsConn, conf.WSEvent), nil }