当前位置: 首页 > 知识库问答 >
问题:

Android HttpsUrlConnection eof exception

漆雕正奇
2023-03-14

我有一个问题,当我尝试读取任何输入时,我的网络连接会抛出一个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)

缓冲输入流:

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");
}

谢谢!

瑞克

共有3个答案

高琛
2023-03-14

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

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

宋嘉懿
2023-03-14

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

我的服务器使用的是python SimpleHTTPServer,我错误地认为我只需要做以下事情就可以表明成功了:

self.send_response(200)

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

我更改了我的服务器来执行此操作(添加内容长度以进行良好的衡量):

self.send_response(200)
self.send_header("Content-Length", "0")
self.end_headers()

该代码不再有 EOF 异常。“连接:关闭”解决方案可能会在某些服务器上触发某些行为,这些行为可能会解决此问题(例如,在关闭之前确保响应有效),但Python SimpleHTTPServer的情况并非如此,根本原因证明是我的错。

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

田翔
2023-03-14

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

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

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

相关问答

相关文章

相关阅读