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

使用OkHttp-SSE时SocketTimeoutException超时不符预期问题求助

OkHttp-SSE超时异常不符合预期的原因分析及解决

核心原因

你设置的readTimeout是单次读取操作的超时,并非长连接的空闲超时:

  • OkHttp的readTimeout仅控制「从发起读取请求到收到数据」的等待时长,一旦服务器发送了任何数据(哪怕是SSE的注释心跳,比如: \n),超时计时器就会重置。
  • 你观察到3分钟才触发超时,大概率是服务器每2分钟左右发送了一次心跳数据,导致readTimeout不断被重置,直到连续3分钟没有任何数据传输才触发异常。
  • 另一种可能是OkHttp默认的重试机制:它会对SocketTimeoutException这类可重试异常进行重试,重试间隔叠加后总时长达到了3分钟。

解决办法

  1. 配置主动PING检测空闲超时
    要实现「连续1分钟无数据就断开」的效果,需要结合pingInterval主动发送PING帧,配合readTimeout检测存活:
OkHttpClient httpClient = new OkHttpClient.Builder()
    .connectTimeout(1, TimeUnit.MINUTES)
    .readTimeout(1, TimeUnit.MINUTES)
    .writeTimeout(1, TimeUnit.MINUTES)
    .pingInterval(30, TimeUnit.SECONDS) // 每30秒发一次PING,确保1分钟内无响应就触发超时
    .build();
  1. 禁用不必要的重试
    如果不需要重试机制,避免超时后重试拉长总时长,可关闭重试:
OkHttpClient httpClient = new OkHttpClient.Builder()
    .connectTimeout(1, TimeUnit.MINUTES)
    .readTimeout(1, TimeUnit.MINUTES)
    .writeTimeout(1, TimeUnit.MINUTES)
    .retryOnConnectionFailure(false)
    .build();
  1. 确认服务器端心跳配置
    检查服务器是否配置了SSE心跳(定期发送注释或空事件),如果服务器没有主动发送心跳,客户端的pingInterval会强制触发连接检测,确保超时符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:03:29