后端程序启动后 120 秒左右就卡死了,无论推送速度是快还是慢,总是会卡死。没有任何报错信息。
后端用的是 go,gin 框架中开了 2 个协程,1 个用来接受数据,1 个用来入库和用 websocket 发给前端。
接受数据和数据库写入都没问题。应该就是 websocket 推给前端时的问题。也检查了协程数,都是正常的。
var upgrader = websocket.Upgrader{
// ReadBufferSize: 1024,
//WriteBufferSize: 1024,
// 允许所有的 CORS 跨域请求,正式环境可以关闭
CheckOrigin: func(r *http.Request) bool {
return true
},
}
var dataTmp []byte
func init() {
http.HandleFunc("/ws", wsHandler)
}
// 启动程序
func StartWebsocket(addrPort string) {
http.ListenAndServe(addrPort, nil)
}
func(){
...
go StartWebsocket("173.10.10.100:88")
...
}
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 {
if len(dataTmp) != 0 {
fmt.Println(time.Now())
err := wsConn.WriteMessage(websocket.TextMessage, dataTmp)
dataTmp = dataTmp[0:0]
if err != nil {
fmt.Println("发送消息给客户端发生错误", err.Error())
wsConn.Close()
return
}
}
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.