Android的HttpsURLConnection的EOFException类(Android H

2019-07-21 15:28发布

我有一个问题,即,当我尝试读取任何输入我的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的新版本中,存在与回收的URL连接的错误。 为了解决这个问题(虽然可能有一些性能问题),我需要添加:

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

谢谢!

干草堆

Answer 1:

有人要求我回答我的问题,而不是编辑。 因此,这里又是答案。

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

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


Answer 2:

你不指定服务器,所以可能是你已经实现了自己的自定义一个。 很可能你的反应是不是由HTTP规范完全正确的。

使用python SimpleHTTPServer我的服务器是,我被错误地假定所有我需要做的,表示成功是以下几点:

self.send_response(200)

这将初始响应头线路,服务器和日期头,但却会让你能够发送额外的头太在状态流。 HTTP需要头后,一个额外的新行以表明他们完成。 如果当您试图得到的结果身体的InputStream或响应代码等与HttpURLConnection类则抛出EOFException类(这实际上是合理的,想着它)这个新行不存在时出现。 一些HTTP客户端没有接受短的响应和报道的成功结果代码,导致我也许不公平指着HttpURLConnection的手指。

我改变了我的服务器要做到这一点,而不是(添加Content-Length的好措施):

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

没有更多的EOFException,使用该代码。 这是可能的“连接:关闭”的解决方案触发某些服务器上的一些行为可能会解决这个(如确保响应有效闭幕前),但不是与蟒蛇SimpleHTTPServer的情况下,与根本原因竟然是我的错。

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



Answer 3:

首先,检查你的网址是否包含意外换行符(“\ n”或“\ r \ n”),如果那样,你会读响应时获得EOFException类。 新行会干线HTTP包和服务器认为客户有更多的数据要发送,所以没有回应。 每次尝试读取响应将立即得到EOF。

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



Answer 4:

我用NetHttpTransport从google-api-java-client ,所以还不是真正明白如何设置RequestProperty,我切换到使用ApacheHttpTransport和问题走了。



文章来源: Android HttpsUrlConnection eofexception