android用okhttp的坑之java.io.IOException: unexpected end of stream on okhttp3.Address@178de5cc!

在使用Okhttp的过程中频繁的发起Http请求时偶尔会看到如下的错误

ERROR [IOException]-[120]

java.io.IOException: unexpected end of stream on okhttp3.Address@178de5cc

at okhttp3.internal.http.Http1xStream.readResponse(Http1xStream.java:201)

at okhttp3.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:127)

at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:53)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)

at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)

at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:109)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)

at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)

at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:124)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)

at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170)

at okhttp3.RealCall.access$100(RealCall.java:33)

at okhttp3.RealCall$AsyncCall.execute(RealCall.java:120)

at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)

at java.lang.Thread.run(Thread.java:841)

Caused by: java.io.EOFException: \n not found: size=0 content=…

at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:215)

at okhttp3.internal.http.Http1xStream.readResponse(Http1xStream.java:186)

... 21 more

不知是Okhttp的一个bug还是什么奇妙的原因。功夫不负有心人苦逼的找了一个下午,终于找到了一个解决方案,就是在http的头部添加addHeader("Connection", "close"),

即增加关闭连接,不让它保持连接。后来自己测试一番貌似再没有出现过上面的问题了。

不加头部时Connection的值为Keep-Alive

增加Connection=false后头部如下:

关于Http头 Connection=close的作用:

在http1.1中request和reponse header中都有可能出现一个connection头字段,此header的含义是当client和server通信时对于长链接如何进行处理。

在http1.1中,client和server都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close.

不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。 HTTP Connection的 close设置允许客户端或服务器中任何一方关闭底层的连接双方都会要求在处理请求后关闭它们的TCP连接。


下面是addHeader的正确的方式:

class   NetInterceptor   implements   Interceptor {

@Override

public Responseintercept(Chain chain)throws IOException {

Request request = chain.request().newBuilder()

.addHeader("Connection","close").build();

returnchain.proceed(request);

}

}


OkHttpClient client =newOkHttpClient.Builder()

.addNetworkInterceptor(new NetInterceptor())

.build();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简介 目前在HTTP协议请求库中,OKHttp应当是非常火的,使用也非常的简单。网上有很多文章写了关于OkHttp...
    第八区阅读 1,405评论 1 5
  • OkHttp源码的samples的简单使用的示例: public static void main(String....
    _warren阅读 829评论 0 1
  • 关于okhttp是一款优秀的网络请求框架,关于它的源码分析文章有很多,这里分享我在学习过程中读到的感觉比较好的文章...
    蕉下孤客阅读 3,638评论 2 38
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,200评论 19 139
  • 现在生活迷茫,主要是工作没有着落,痛苦啊。不知道自己能干什么?不太喜欢机械。。。。那个自己在行什么呢?心累了
    阳光下奔跑的孩子阅读 104评论 0 0