根据关键异常信息:EOF一般指输入流达到末尾,无法继续从数据流中读取; 怀疑可能是由于双方(client<->server) 建立的连接,server端主动close了,为了验证以上猜想:
github issue链接
,根据@edallagnol 描述,当两次请求时间间隔超过server端配置的keep-alive timeout ,server端会主动关闭当前连接,Okhttp 连接池ConnectionPool 默认超时时间是5min,也就是说优先复用连接池中的连接,然而server已经主动close,导致输入流中断,进而抛出EOF 异常。其中keep-alive:两次请求之间的最大间隔时间 ,超过这个间隔 服务器会主动关闭这个连接, 主要是为了避免重新建立连接,已节约服务器资源。
-
根据上述分析,在创建OkHttpClient实例时,只需要将retryOnConnectionFailure设置为true ,在抛出EOF异常时,让其可以继续去执行realChain.proceed方法即可
-
在http请求头中添加request.addHeader(“Connection”, “close”),即不复用TCP长连接
-
ConnectionPool 中连接默认超时时间是5min,可以减小超时时间,保证ConnectionPool中连接过期时间小于server端的keep_alive时间
参考:
https://juejin.cn/post/6844903648854540301
赠送jar包:
okhttp
-3.14.9.jar;
赠送原API文档:
okhttp
-3.14.9-
java
doc.jar;
赠送源代码:
okhttp
-3.14.9-sources.jar;
赠送Maven依赖信息文件:
okhttp
-3.14.9.pom;
包含翻译后的API文档:
okhttp
-3.14.9-
java
doc-API文档-中文(简体)-英语-对照版.zip;
Maven坐标:com.squareup.
okhttp
3:
okhttp
:3.14.9;
标签:squareup、
okhttp
3、
okhttp
、jar包、
java
、中英对照文档;
使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。
人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
双语对照,边学技术、边学英语。
排查与解决
java
.
io
.
EOF
Exception
: \n not found: limit=0
content
=…
起因是项目向华为云 OBS 请求视频, 偶现题目中的异常;如果等一段时间(30s),就可以正常读取到视频。
原因是 OBS SDK 底层用的
Okhttp
连接池,而
Okhttp
的 GitHub 上也有相关 issue:
服务器在返回数据后就直接关闭 TCP 连接,而客户端(项目应用)却将连接放入连接池重复使用;
当下次请求复用时,连接已经被关闭,就读取不到返回值,报上述异常。
android用
okhttp
的坑之
java
.
io
.
IO
Exception
:
unexpected
end
of stream on
okhttp
3.Address@178de5cc
ERROR [
IO
Exception
]-[120]
java
.
io
.
IO
Exception
:
unexpected
end
of stream on
okhttp
3.Address@178de5cc
at
okhttp
3.internal.http.Http1xStream.readResponse(Http1xStre...
由于此问题不是必现,故不太好定位排查,根据关键异常信息:
EOF
一般指输入流达到末尾,无法继续从数据流中读取; 怀疑可能是由于双方(client<->server) 建立的连接,某一方主动close了,为了验证以上猜想,笔者查阅了相关资料,以及做了一些简单的代码实验
Github Issue or google or stackoverflow?
根据@...
1、如果你没有使用
OkHttp
Client单例模式的话,而是每次都new 一个
OkHttp
Client 在大量的请求下,很容易就会出现OOM 因为
OkHttp
Client 每new 一个 就会创建一个线程池,线程池默认有5个线程,不断new 就会出现OOM
2、在使用
OkHttp
Client 单例模式的情况下,出现
IO
Exception
和
EOF
Exception
类似如下:
java
.
io
.
IO
Exception
:
unexpected
end
of stream on Connect
io
n{xxx,
OkHttp
Client:
IO
问题排查
我们有个需求需要获取上传至oss图片的宽高信息,在原有文件链接后面加上后缀?x-oss-process=image/info,然后使用
OkHttp
Client组装get请求获取数据。在测试环境测试的时候,发现会出现偶现的
IO
Exception
报错
java
.
io
.
IO
Exception
:
unexpected
end
of stream on Connect
io
n{, proxy=DIRECT hostAddress= cipherSuite=TLS_EC
okhttp
3.2与okip1.6,使用
okhttp
3.2请求必须要ok
io
一起使用。出现
Exception
in thread "main"
java
.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
at ok
io
.Ok
io
.source(Ok
io
.kt)
at
okhttp
3.internal.
io
.RealConnect
io
n.connectSocket(RealConnect
io
n.
java
:144)
at
okhttp
3.internal.
io
.RealConnect
io
n.connect(RealConnect
io
n.
java
:111)
at
okhttp
3.internal.http.StreamAllocat
io
n.findConnect
io
n(StreamAllocat
io
n.
java
:188)
at
okhttp
3.internal.http.StreamAllocat
io
n.findHealthyConnect
io
n(StreamAllocat
io
n.
java
:127)
可以更换为此版本
websocket 服务使用 Nginx 反向代理后,发现会自动断开,查看日志如下
2021-04-30 10:34:02.404 ERROR 153322 --- [n
io
-8088-exec-7] com.yxc.imapi.core.WebSocketServer : 发生错误:null,Sess
io
n ID: 1e
java
.
io
.
EOF
Exception
at org.apache.tomcat.util.net.N
io
End
point$N
io
SocketWrapper.fillR
这个错误通常是因为缺少
OkHttp
库的依赖所导致的。请确保在您的项目中添加了
OkHttp
库的依赖。
在 Gradle 中,您可以添加以下代码来添加
OkHttp
库的依赖:
implementat
io
n 'com.squareup.
okhttp
3:
okhttp
:4.9.0'
如果您正在使用 Maven,请将以下代码添加到您的 pom.xml 文件中:
<dep
end
ency>
<groupId>com.squareup.
okhttp
3</groupId>
<artifactId>
okhttp
</artifactId>
<vers
io
n>4.9.0</vers
io
n>
</dep
end
ency>
请注意,版本号可能会有所不同,具体取决于您正在使用的版本。
nginx问题排查: upstream prematurely closed connection while reading response header from upstream
27518
nginx问题排查: upstream prematurely closed connection while reading response header from upstream
mentcide:
nginx问题排查: upstream prematurely closed connection while reading response header from upstream
点点教程:
nginx问题排查: upstream prematurely closed connection while reading response header from upstream
明知你是错的人:
CXF导致的JVM MetaSpace OOM问题
夜幕下的尖椒:
CXF导致的JVM MetaSpace OOM问题
夜幕下的尖椒: