报错有时是 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
}
}
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.