OkHttp EOFException: \n not found: size=0 content=
date
Aug 12, 2021
slug
somthing error
status
Published
tags
问题
okhttp
summary
type
Post
问题 Log 及相关信息
网络沟通双方使用了 Connection: Keep-Alive 配置进行连接复用,客户端在首次请求之后的 1min 再次请求,可能会出现 java.io.EOFException: \n not found: size=0 content= 的问题。
问题原因
沟通双方的对 keep-alive 的超时时长未统一,Android 端的 OkHttpClient 的 ConnectionPool 默认为 5min,Spring-boot 则为 60s。
可能复现的场景
解决方案
服务器或客户端保持一致即可。
Android 客户端
使用 OkHttp 时自定义 ConnectionPool 重设超时时长
clientBuilder.connectionPool(new ConnectionPool(5, 60, TimeUnit.SECONDS));
Spring-Boot 服务器
自定义 Http1NioProtocol 中的 keepAliveTimeout。
@Configuration
class Config : WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
override fun customize(factory: ConfigurableWebServerFactory?) {
factory?.let {
(it as TomcatServletWebServerFactory).addConnectorCustomizers(object : TomcatConnectorCustomizer {
override fun customize(connector: Connector?) {
connector?.also { innerConnector ->
val protocolHandler: Http11NioProtocol = innerConnector.protocolHandler as Http11NioProtocol
// keep alive 时长设置
println("reset protocol keep alive timeout")
protocolHandler.keepAliveTimeout = 60 * 5 * 1000
}
}
})
}
}
}