websocket通信,错误1006导致服务卡死

Golang开发websocket通信,错误1006导致服务卡死问题处理

项目场景:

golang开发的websocket服务端和客户端分别进行发送、接收数据操作,在网络不够稳定的情况下(如无线网络),经常出现超时的情况,在接收端做了超时处理:
*conn websocket.Conn
conn.SetReadDeadline(time.Now().Add(ReadTimeout * time.Second))
msgType, message, err := conn.ReadMessage()
if err != nil {
log.Println(“read err:”, err.Error())
return
}
conn.SetReadDeadline(time.Time{})

然后进行重连或退出操作;


问题描述:

但是,发送端出现了问题:当接收端已经判定为超时的情况下,发送端却还在继续发送,如果接收端不主动断开,当发送端继续发送时间超过60秒后,发送端卡死,无法再响应接收端的链接请求(这个问题网上都说是nginx的问题,总之不是我的锅,都是操作系统惹的祸),需要重启发送端服务; 当然,这个情况可以通过接收端判定超时后进行断线重连解决,也可以通过心跳机制进行处理,但是对发送端来说都是被动的,需要依赖接收端的做法,如果接收端处理不好,发送端不是要看别人的脸色,不爽。

解决方案:

相信golang开发者肯定比我牛逼,这个问题应该有处理方法吧,所以查websocket源码文件:websocket/conn.go ,找到一个很眼熟的函数:SetWriteDeadline ,没错,就是她:
conn.SetWriteDeadline(time.Now().Add(WriteTimeout * time.Second))
err := conn.WriteMessage(ws.BinaryMessage, frame)
if err != nil {
log.Println(“write err:”, err.Error())
return
}
conn.SetWriteDeadline(time.Time{})

就是这么简单,再也不用看发送端的脸色(只要注意WriteTimeout不要超过60秒就好),这个问题从出现、发现问题、解决用了3天时间,在网上也没查到,其实很简单,希望大家少走一点弯路

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值