报错有时是 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
			}
		}
	}
}