You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WebSocket连接报错‘主机软件终止已建立连接’问题排查求助

关于WebSocket升级时出现连接中止错误的分析

先还原下你的代码场景,方便理解问题背景:

后端Go代码

var upgrader = websocket.Upgrader{
    ReadBufferSize: 1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}
// ..................
http.HandleFunc("/notifications", func(w http.ResponseWriter, r *http.Request) {
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        logrus.Panic(err)
    }
})

前端JS代码

conn = new WebSocket("ws://host:2020/notifications");
conn.onmessage = function (event) {
    if(event.data != "") {
        newMessage(JSON.parse(event.data));
    }
};

你遇到的这个错误确实和网络及连接交互直接相关,下面是几个最可能的触发原因:

  • 前端连接提前中断:比如用户在WebSocket握手还没完成时就刷新页面、关闭标签页,或者前端进程意外崩溃。这时候后端还在尝试完成升级响应的写操作,结果发现连接已经被前端主动切断,就会抛出这个“连接被主机软件中止”的错误。

  • 主机安全工具拦截:后端所在机器上的防火墙、杀毒软件或者其他安全防护工具,可能在握手过程中把这个WebSocket连接判定为可疑请求,主动中止了它。这种情况通常是间歇性的,和安全工具的实时规则、当前系统负载都有关系。

  • 网络波动导致连接中断:前端和后端之间的网络如果出现短暂波动(比如路由切换、带宽突然拥堵),可能会让正在建立的WebSocket连接意外断开。当后端尝试写升级响应时,就会发现连接已经失效,从而触发这个错误。

  • 后端处理延迟引发前端超时:如果后端当时CPU、内存负载过高,处理WebSocket升级请求的速度变慢,前端可能会因为等待超时主动断开连接。这时候后端再去执行写操作,自然会得到连接中止的错误。

另外提个小建议:把logrus.Panic(err)改成logrus.Error(err)会更合适,因为Panic会直接终止当前goroutine,可能影响其他正常连接的处理——毕竟这个错误是偶发的连接异常,没必要让整个服务逻辑崩溃。

内容的提问来源于stack exchange,提问作者user12270548

火山引擎 最新活动