You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OkHttp中WebSocket的onFailure方法是否会自动关闭连接?

OkHttp WebSocket onFailure 方法是否自动关闭连接?

结论:OkHttp 不会在触发 onFailure 方法时自动关闭 WebSocket 连接,你需要手动执行关闭或取消操作

当 WebSocket 出现故障(如连接失败、通信错误等)触发 onFailure 时,OkHttp 仅负责通知你错误发生,不会主动关闭连接或释放底层资源。此时连接可能处于异常存活状态,若不手动处理,会存在资源泄漏的风险。

对你现有实现的分析与优化建议

你的手动关闭思路是正确的,但有几个细节可以调整:

  • super.onFailure(...) 调用无实际意义,因为 WebSocketListener 的默认 onFailure 方法是空实现,没有任何逻辑。
  • 故障场景下,使用**1011(服务端异常)或1006(连接异常关闭)**这类错误状态码,比正常关闭的1000语义更准确。
  • cancel() 的调用合理,当 close() 返回 false 时,说明连接已无法正常关闭,此时强制取消可以释放底层资源。
  • 自定义的 close() 方法需确保完成本地资源清理(如取消订阅、释放关联对象等)。

优化后的示例代码:

@Override
public void onFailure(@NonNull WebSocket webSocket, @NonNull Throwable t, @Nullable Response response) {
    // 用对应错误状态码关闭连接
    boolean closedSuccessfully = webSocket.close(1011, "Connection failed: " + t.getMessage());
    if (!closedSuccessfully) {
        webSocket.cancel();
        // 清理本地资源
        close();
    }
}

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:55:20