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();

java接入智谱清言Exception in thread "main" java.lang.RuntimeException: java.net.SocketTimeoutException: timeout at io.reactivex.internal.util.ExceptionHelper.wrapOrThrow(ExceptionHelper.java:45) at io.reactivex.internal.observers.BlockingMultiObserver.blockingGet(BlockingMultiObserver.java:90) at io.reactivex.Single.blockingGet(Single.java:2002) at com.zhipu.oapi.AbstractClientBaseService.execute(ClientV4.java:82) at com.zhipu.oapi.ClientV4.executeRequest(ClientV4.java:505) at com.zhipu.oapi.ClientV4.invoke(ClientV4.java:176) at com.zhipu.oapi.ClientV4.invokeModelApi(ClientV4.java:151) at com.jason.health.controller.AITest.Test1(AITest.java:70) at com.jason.health.controller.AITest.main(AITest.java:24) Caused by: java.net.SocketTimeoutException: timeout at okhttp3.internal.http2.Http2Stream$StreamTimeout.newTimeoutException(Http2Stream.kt:675) at okhttp3.internal.http2.Http2Stream$StreamTimeout.exitAndThrowIfTimedOut(Http2Stream.kt:684) at okhttp3.internal.http2.Http2Stream.takeHeaders(Http2Stream.kt:143) at okhttp3.internal.http2.Http2ExchangeCodec.readResponseHeaders(Http2ExchangeCodec.kt:96) at okhttp3.internal.connection.Exchange.readResponseHeaders(Exchange.kt:106) at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.kt:79) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:34) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76) at okhttp3.internal.http.RealInterce
最新发布
03-18
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值