OkHttp EOFException: \n not found: size=0 content=

date
Aug 12, 2021
slug
somthing error
status
Published
tags
问题
okhttp
summary
type
Post
notion image

问题 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
                    }
                }
            })
        }
    }
}

参考链接

notion image

© Craig Hart 2021 - 2025