IOException: unexpected end of s

2017-11-29  本文已影响0人  Li李萌

测试小哥跟我说偶有网络连接错误的问题,看了一下日志,方法报了这个错误IOException: unexpected end of stream on Connection。我去网上找了找一般这个问题出现的原因有一下两种,不过我的是第二种原因:

1、首先在github上看到这个问题的解释:The error occurs when OkHttp try to reuse a connection that is in FIN_WAIT2 state in server, because the server keep_alive timeout is lesser than the client timeout.  于是发现了我这代码可能出问题的地方,我的okhttp设置的timeout是100,而服务器一般是60修改后暂时没发生过这个问题。

2、IOException: unexpected end of stream on Connection这个产生的原因是和okhttp和版本都有关系,需要在拦截器中增加一个addHeader("Connection","close")。写法如下:

if (Build.VERSION.SDK != null && Build.VERSION.SDK_INT > 13) {

urlConnect.setRequestProperty("Connection", "close");

}

或者重新写一个拦截器如:

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

}

这个出现原因说白就是server和client中tcp链接的原因,增加addHeader("Connection","close")后当请求处理完后会断掉,之后在每次请求都会创建新的tcp链接。

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

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

感谢一下博客:http://blog.csdn.net/mace_android/article/details/72121638 ,http://www.jianshu.com/p/dea2ffb1c3b1 ,http://blog.csdn.net/blackice1015/article/details/51018815

上一篇下一篇

猜你喜欢

热点阅读