以下是最简单的问题描述:
我使用HttpUrlConnection对象通过代理创建HTTPS连接到我的服务器。
我的代理关闭了连接,但我的代码仍然尝试重用相同的连接。因此,我收到EOFException异常。
如何处理这种情况?
以下是最简单的问题描述:
我使用HttpUrlConnection对象通过代理创建HTTPS连接到我的服务器。
我的代理关闭了连接,但我的代码仍然尝试重用相同的连接。因此,我收到EOFException异常。
如何处理这种情况?
我曾经在使用普通的HTTP连接时遇到了这个问题。第一次请求正常,第二次则出现EOFException异常。
最终,我通过删除...来解决了这个问题。
urlConnection.setChunkedStreamingMode(0);
...来自HttpUrlConnection。
可能是我调用的Web服务器无法很好地处理分块数据。不确定。
If you don't want to reuse the connection then release it.
finally {
urlConnection.disconnect();
}
if (Build.VERSION.SDK != null
&& Build.VERSION.SDK_INT > 13) {
con.setRequestProperty("Connection", "close");
}
您不应该尝试重用相同的HttpURLConnection实例。在“类概述”的最后一行中,文档说:
每个HttpURLConnection实例只能用于一个请求/响应对。
Keep-Alive连接在不同的级别上工作,请参阅断开连接文档: http://developer.android.com/reference/java/net/HttpURLConnection.html#disconnect()
与其他Java实现不同,这不一定会关闭可以重复使用的套接字连接。您可以在发出任何HTTP请求之前将http.keepAlive系统属性设置为false来禁用所有连接重用。
因此,您应始终使用新的HttpURLConnection,并让套接字池处理重用。
显然,在Froyo(2.2)之前的保持活动连接存在错误,因此建议在这些旧设备上禁用keep-alive。
在我的情况下,EOFException是由于我的服务器没有发送完整的响应引起的,请在此处查看详细信息:https://stackoverflow.com/a/27845172/2335025您不应该尝试重复使用相同的HttpURLConnection实例。在“类概述”的底部文档中说:
每个HttpURLConnection实例只能用于一个请求/响应对。
长连接是在不同的层级上进行管理的,参见disconnect文档: http://developer.android.com/reference/java/net/HttpURLConnection.html#disconnect()
与其他Java实现不同,这不一定会关闭可以重用的套接字连接。您可以在发出任何HTTP请求之前将http.keepAlive系统属性设置为false来禁用所有连接重用。
因此,您应该始终使用新的HttpURLConnection实例,并让套接字池处理重用。如果它尝试重用已被服务器关闭的套接字,则可能存在问题,这些问题的答案涉及到:Android HttpUrlConnection EOFException
显然,在Froyo(2.2)之前的保持连接存在错误,因此建议在这些旧设备上禁用保持连接。
在我的情况下,EOFException是由于我的服务器未发送完整响应引起的,请参见此处的详细信息:https://dev59.com/iGIk5IYBdhLWcg3wdd4l#27845939
httpClient
“有更多的错误”并且已经被废弃,但是这个与JellyBean相关的问题是一个无法忽视的大问题。我正在使用Ksoap2,所以我尝试了所有建议的答案。
System.setProperty("http.keepAlive", "false");
httpTransportSE.getServiceConnection().setRequestProperty("Connection", "close");
httpTransportSE.getServiceConnection().disconnect();
public static InputStream getUrlData(final String url)
throws URISyntaxException, ClientProtocolException, IOException {
final DefaultHttpClient client = new DefaultHttpClient();
final HttpGet method = new HttpGet(new URI(url));
final HttpResponse res = client.execute(method);
return res.getEntity().getContent();
}
我发现重试连接可以解决问题,如此处所示:https://dev59.com/iGIk5IYBdhLWcg3wdd4l#20302767
确保在递归调用之前关闭连接。
此外,我添加了以下内容来关闭连接,尽管我不确定它是否有帮助:
if (retries > 0) {
connection.setRequestProperty("Connection", "close");
}