【问题标题】:Android HttpsUrlConnection eofexceptionAndroid HttpsUrlConnection eofexception
【发布时间】:2013-03-02 21:59:54
【问题描述】:

我有一个问题,当我尝试读取任何输入时,我的 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");
}

谢谢!

瑞克

【问题讨论】:

  • Build.VERSION.SDK你没用过,不需要检查。
  • urlConnect.setRequestProperty("Connection", "close");
  • 它对我有用,魔法!!!谢谢你的帖子。
  • 你应该将你的答案添加为答案并接受它。

标签: android httpurlconnection eofexception


【解决方案1】:

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

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

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

【讨论】:

  • 这应该去哪里?
  • 如果没有检查 Build.VERSION.SDK_INT 怎么办?
  • 我们还能做些什么吗?在我的情况下,设置此标头没有帮助。
  • 它没有解决这个问题。 EOFException 仍然存在。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您没有指定您的服务器,因此它可能是您自己实现的自定义服务器。根据 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 错误。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-16
        • 2014-06-11
        • 2012-09-01
        • 2016-11-05
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多