40

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

例子:

urlConnect.getResponseCode() // will throw error
urlConnect.getResponseMessage() // will throw error
BufferedInputStream in = new BufferedInputStream(urlConnect.getInputStream()); //will throw error

这是每个的堆栈跟踪:

得到响应:

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)

缓冲输入流:

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 中,有一个回收 url 连接的错误。为了解决这个问题(尽管可能存在一些性能问题),我需要添加:

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

谢谢!

瑞克

4

4 回答 4

42

有人要求我回答我自己的问题而不是编辑。所以这里又是一个答案。

这不是一个有据可查的答案。它出现在一些较新版本的 android 中,有一个回收 url 连接的错误。为了解决这个问题(尽管可能存在一些性能问题),我需要添加:

if (Build.VERSION.SDK != null && Build.VERSION.SDK_INT > 13) {
    urlConnect.setRequestProperty("Connection", "close");
}
于 2013-07-22T15:41:51.943 回答
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 的情况并非如此,根本原因结果是我的错。

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

于 2015-01-08T16:34:03.167 回答
1

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

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

于 2015-01-30T09:35:16.967 回答
0

我使用 NetHttpTransport ,google-api-java-client所以如何设置 RequestProperty 并不明显,我切换到使用 ApacheHttpTransport 并且问题消失了。

于 2014-02-07T02:38:18.747 回答