golang 使用 websocket 发送数据给前端,总是会有丢包的情况发生
資深大佬 : swqslwl 6
报错有时是 write:broken pipe. 有时是 An established connection was aborted by the software in your host machine. 有时不报错,wrieshark 抓包发现包全部发出去了,但前端就是会丢包。
上个帖子犯了个低级错误用了共享内存变量,现在改为用 channel 了,想知道是不是还是我后端代码的问题。
如果有提供很大帮助思路的,小弟可以给予一定的酬谢。
var dataTmp = make(chan []byte, 9999) var t = make(chan []byte, 9999) var upgrader = websocket.Upgrader{ // ReadBufferSize: 1024, WriteBufferSize: 1024, // 允许所有的 CORS 跨域请求,正式环境可以关闭 CheckOrigin: func(r *http.Request) bool { return true }, } func init() { http.HandleFunc("/ws", wsHandler) go http.ListenAndServe("173.10.10.100:88", nil) } func wsHandler(resp http.ResponseWriter, req *http.Request) { // 答客户端告知升级连接为 websocket wsSocket, err := upgrader.Upgrade(resp, req, nil) if err != nil { fmt.Println("升级为 websocket 失败", err.Error()) return } go wsWriteLoop(wsSocket) } // 发送消息给客户端 func wsWriteLoop(wsConn *websocket.Conn) { for { select { case terror := <-t: fmt.Println("错误重新发送") fmt.Println(terror) err := wsConn.WriteMessage(websocket.TextMessage, terror) if err != nil { fmt.Println("再次发送", err.Error()) t <- terror return } case tmp := <-dataTmp: err := wsConn.WriteMessage(websocket.TextMessage, tmp) if err != nil { fmt.Println("发送消息给客户端发生错误", err.Error()) t <- tmp return } } } }
大佬有話說 (10)