我有一个问题,当我尝试读取任何输入时,我的HttpsURLConnection将抛出EOFException。该代码适用于某些网络调用,但在其他网络调用上失败。如果我尝试从连接中读取任何内容,则会因上述错误而失败。
示例:
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)
感谢您的帮助,
瑞克
修改 我找到了答案:
这不是一个记录良好的答案。它出现在一些较新版本的android中,有一个带有回收网址连接的错误。要解决此问题(尽管可能存在一些性能问题),我需要添加:
if (Build.VERSION.SDK != null
&& Build.VERSION.SDK_INT > 13) {
urlConnect.setRequestProperty("Connection", "close");
}
谢谢!
瑞克
答案 0 :(得分:43)
有人要求我回答我自己的问题,而不是编辑。所以这是答案。
这不是一个记录良好的答案。它出现在一些较新版本的android中,有一个带有回收网址连接的错误。要解决此问题(尽管可能存在一些性能问题),我需要添加:
if (Build.VERSION.SDK != null && Build.VERSION.SDK_INT > 13) {
urlConnect.setRequestProperty("Connection", "close");
}
答案 1 :(得分:1)
您没有指定服务器,因此可能是您自己实施的自定义服务器。 HTTP规范可能会使您的响应不正确。
我的服务器正在使用python SimpleHTTPServer,我错误地假设我需要做的就是表明成功如下:
self.send_response(200)
它发送初始响应标题行,服务器和日期标题,但使流处于您能够发送其他标题的状态。 HTTP需要在标题之后添加一个新行以表示它们已完成。当你尝试使用HttpURLConnection获取结果体InputStream或响应代码等时,如果这个新行不存在,那么它会抛出EOFException(这实际上是合理的,考虑它)。一些HTTP客户端确实接受了短响应并报告了成功结果代码,这导致我可能不公平地指责HttpURLConnection。
我改变了我的服务器来做这件事(添加Content-Length以获得良好的衡量标准):
self.send_response(200)
self.send_header("Content-Length", "0")
self.end_headers()
该代码不再有EOFException。 “连接:关闭”解决方案可能会在某些可能解决此问题的服务器上触发某些行为(例如,确保响应在关闭之前有效)但python SimpleHTTPServer不是这种情况,根本原因是我的错。
注意:在pre-Froyo(2.2)上有一些与保持连接有关的错误,但我不认为这个问题有足够的信息来声称新版本有Android漏洞。
答案 2 :(得分:1)
首先,检查您的网址是否包含意外的换行符('\ n'或'\ r \ n'),如果有,您在阅读回复时会收到EOFException。新行将中继HTTP包,服务器认为客户端有更多数据要发送,因此没有响应。每次阅读回复的尝试都会立即获得EOF。
确保您的请求有效后,请尝试其他人提供的解决方案。
答案 3 :(得分:0)
我使用来自google-api-java-client
的NetHttpTransport,所以如何设置RequestProperty并不是很明显,我转而使用ApacheHttpTransport,问题就消失了。