Android HttpsUrlConnection EOFEException

Android HttpsUrlConnection EOFEException,android,httpurlconnection,eofexception,Android,Httpurlconnection,Eofexception,我有一个问题,当我尝试读取任何输入时,我的HttpsURLConnection将抛出一个EOFEException。该代码适用于某些网络调用,但在其他网络调用上失败。如果我尝试从连接中读取任何内容,它将失败,并出现上述错误 例如: urlConnect.getResponseCode() // will throw error urlConnect.getResponseMessage() // will throw error BufferedInputStream in = new Buff

我有一个问题,当我尝试读取任何输入时,我的HttpsURLConnection将抛出一个EOFEException。该代码适用于某些网络调用,但在其他网络调用上失败。如果我尝试从连接中读取任何内容,它将失败,并出现上述错误

例如:

urlConnect.getResponseCode() // will throw error
urlConnect.getResponseMessage() // will throw error
BufferedInputStream in = new BufferedInputStream(urlConnect.getInputStream()); //will throw error
以下是每个堆栈的堆栈跟踪:

getResponse:

03-14 09:49:18.547: W/System.err(6270): java.io.EOFException
03-14 09:49:18.547: W/System.err(6270):     at libcore.io.Streams.readAsciiLine(Streams.java:203)
03-14 09:49:18.547: W/System.err(6270):     at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:573)
03-14 09:49:18.547: W/System.err(6270):     at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:821)
03-14 09:49:18.547: W/System.err(6270):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283)
03-14 09:49:18.547: W/System.err(6270):     at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:495)
03-14 09:49:18.547: W/System.err(6270):     at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134)
BufferedInputStream:

03-14 09:39:14.077: W/System.err(5935): java.io.EOFException
03-14 09:39:14.077: W/System.err(5935):     at libcore.io.Streams.readAsciiLine(Streams.java:203)
03-14 09:39:14.077: W/System.err(5935):     at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:573)
03-14 09:39:14.077: W/System.err(5935):     at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:821)
03-14 09:39:14.077: W/System.err(5935):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283)
03-14 09:50:46.547: W/System.err(6476):     at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)
03-14 09:50:46.547: W/System.err(6476):     at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
谢谢你的帮助

瑞克

编辑 我找到了我的答案:

这不是一个有充分记录的答案。在一些较新版本的安卓系统中,出现了一个回收url连接的错误。要解决此问题(尽管可能存在一些性能问题),我需要添加:

if (Build.VERSION.SDK != null
&& Build.VERSION.SDK_INT > 13) {
urlConnect.setRequestProperty("Connection", "close");
}
if (Build.VERSION.SDK != null && Build.VERSION.SDK_INT > 13) {
    urlConnect.setRequestProperty("Connection", "close");
}
谢谢


里克

有人要求我回答自己的问题,而不是编辑。这是答案

这不是一个有充分记录的答案。在一些较新版本的安卓系统中,出现了一个回收url连接的错误。要解决此问题(尽管可能存在一些性能问题),我需要添加:

if (Build.VERSION.SDK != null
&& Build.VERSION.SDK_INT > 13) {
urlConnect.setRequestProperty("Connection", "close");
}
if (Build.VERSION.SDK != null && Build.VERSION.SDK_INT > 13) {
    urlConnect.setRequestProperty("Connection", "close");
}

我从
谷歌api java客户端使用NetHttpTransport,因此不清楚如何设置RequestProperty,我转而使用ApacheHttpTransport,问题就消失了。

您没有指定服务器,因此它可能是您自己实现的自定义服务器。根据HTTP规范,您的响应可能不太正确

我的服务器使用的是python SimpleHTTPServer,我错误地认为我需要做的只是以下几点来表示成功:

self.send_response(200)
这将发送初始响应头行、服务器和日期头,但使流处于您也可以发送其他头的状态。HTTP需要在头文件之后添加一行新行,以指示它们已完成。当您尝试使用HttpURLConnection获取结果体InputStream或响应代码等时,如果这一新行不存在,那么它就会抛出EOFException(考虑一下,这实际上是合理的)。一些HTTP客户端确实接受了简短的响应,并报告了成功的结果代码,这可能导致我不公平地将矛头指向HttpURLConnection

我将服务器改为这样做(添加内容长度以便更好地衡量):

该代码不再有EOFEException。“Connection:close”解决方案可能会在某些服务器上触发一些行为,这些行为可能会解决此问题(例如,确保关闭前响应有效),但python SimpleHTTPServer并非如此,根本原因是我的错误


注意:Android pre Froyo(2.2)上存在一些与保持活动连接相关的错误,但我认为在这个问题中没有足够的信息来说明新版本上存在Android错误。

首先,检查您的URL是否包含意外的换行符('\n'或'\r\n'),如果包含,您在阅读响应时将收到EOFEException。换行符将中继HTTP包,服务器认为客户端有更多数据要发送,所以并没有响应。每次尝试读取响应都会立即得到EOF


确保您的请求有效后,再尝试其他人提供的解决方案。

您不需要检查Build.VERSION.SDK,因为您没有使用它。urlConnect.setRequestProperty(“连接”,“关闭”);它对我有用,魔术!!!谢谢你的帖子。你应该添加你的答案作为答案并接受它。这应该去哪里?如果你没有检查Build.VERSION.SDK_INT怎么办?我们还有什么可以做的吗?设置此标题对我的情况没有帮助。它无法解决此问题。EOFEException仍然存在。