当前位置:首页 > 系统bug > 正文内容

Android HttpURLConnection抛出EOFException

2019-06-14 | 分类:系统bug | 评论:0人 | 浏览:89次

我使用HttpUrlConnection对象通过代理创建到我的服务器的HTTPS连接。

我的代理关闭连接但我的代码仍尝试重用相同的连接。所以我得到了EOFException。

我该如何处理这类案件?

我建议禁用http.keepalive系统属性。文档的性能部分表明在可能的情况下将重用套接字连接。听起来它试图重用连接,但代理已经关闭了它。在这篇文章中,Darrell还表示改变系统属性解决了他的问题。

System.setProperty("http.keepAlive", "false");

我同意重复使用连接会更好。您确定从连接中获得的InputStream在使用后是否已关闭?如果我关闭输入流,我将释放流所包含的所有资源,包括底层套接字。因此在这种情况下不能重用连接。

image

 

 

 

事实证明他们已经在1月8日在Android中解决了这个问题[1]。该修复程序基本上将旧连接标记为已回收并在内部重试请求。

要解决此问题,我建议在遇到重试限制的EOFException时重试请求以防止stackoverlow。

我也遇到了普通HTTP连接的问题。第一个请求正常,第二个请求因EOFException而失败。

Eventuelly我通过删除修复它…

urlConnection.setChunkedStreamingMode(0);

…来自HttpUrlConnection。

我可能是因为我正在调用的网络服务器无法很好地处理chuncked数据。不知道。

也许httpClient“有更多的错误”并且已被弃用,但JellyBean的这个问题是一个显而易见的问题。我正在使用Ksoap2所以我尝试了所有建议的答案。

  • System.setProperty("http.keepAlive", "false");
  • httpTransportSE.getServiceConnection().setRequestProperty("Connection", "close");
  • httpTransportSE.getServiceConnection().disconnect();

没有任何效果 – 我的解决方案是将我使用的Ksoap2版本从3.1.1回滚到2.6.5。使用2.6.5可以大大减少问题。仍然测试,但甚至可能解决。

我发现重试连接修复了这里出现的问题:https//stackoverflow.com/a/20302767/2520390

确保在递归调用之前关闭连接。

另外,我在连接中添加了以下内容以关闭连接,但我不确定它是否有帮助:

if (retries > 0) {
    connection.setRequestProperty("Connection", "close");
}

您不应该尝试重用相同的HttpURLConnection实例。“类概述”最底线的文档

HttpURLConnection的每个实例可以用于一个请求/响应对。

Keep-Alive连接在不同级别工作,请参阅disconnect文档:http//developer.android.com/reference/java/net/HttpURLConnection.html#disconnect()

与其他Java实现不同,这不一定会关闭可以重用的套接字连接。您可以通过在发出任何HTTP请求之前将http.keepAlive系统属性设置为false来禁用所有连接重用。

所以你应该总是使用一个新的HttpURLConnection并让套接字池处理重用。

在Froyo(2.2)之前显然存在保持活动连接的错误,因此建议在这些旧设备上禁用keep-alive。

在我的情况下,EOFException是由我的服务器没有发送完整响应引起的,请参阅此处的详细信息:

您不应该尝试重用相同的HttpURLConnection实例。“类概述”最底线的文档

HttpURLConnection的每个实例可以用于一个请求/响应对。

Keep-Alive连接在不同级别工作,请参阅disconnect文档:http//developer.android.com/reference/java/net/HttpURLConnection.html#disconnect()

与其他Java实现不同,这不一定会关闭可以重用的套接字连接。您可以通过在发出任何HTTP请求之前将http.keepAlive系统属性设置为false来禁用所有连接重用。

所以你应该总是使用一个新的HttpURLConnection并让套接字池处理重用。如果它试图重用已被服务器关闭的套接字可能会出现问题,这个问题的答案是:Android HttpUrlConnection EOFException

在Froyo(2.2)之前显然存在保持活动连接的错误,因此建议在这些旧设备上禁用keep-alive。

在我的情况下,EOFException是由我的服务器没有发送完整响应引起的,请参阅此处的详细信息:

我第一次连接一切都很好。当我第二次这样做时,它会说EOFException conn.connect()。只有当我在设备级别设置代理时才会发生这种情况。eofexception

来源:赵大虾博客(微信号/QQ号:),转载请注明出处,谢谢!

  • 评论:(0)

已有 0 位网友发表了一针见血的评论,你还等什么?

◎欢迎参与讨论!

傲笑九天志在必得, 卧薪尝胆勇者无畏

站内搜索

傲笑九天志在必得, 卧薪尝胆勇者无畏

傲笑九天志在必得, 卧薪尝胆勇者无畏