Android HttpsUrlConnection eofexception

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

例:

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) 

感谢您的任何帮助,

干草堆

编辑我find了我的答案:

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

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

谢谢!

干草堆

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

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

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

你不指定你的服务器,所以可能是你自己实现的一个自定义的服务器。 HTTP规范可能会导致您的响应不太正确。

我的服务器正在使用python SimpleHTTPServer,我错误地认为我需要做的,以表明成功是以下几点:

 self.send_response(200) 

这将发送最初的响应标题行,服务器和date标题,但将stream保持在可以发送其他标题的状态。 HTTP需要在标题之后添加一个新的行来表示它们已经完成。 看来如果当你试图用HttpURLConnection得到结果体InputStream或响应代码等等时,这个新行不存在,那么它会抛出EOFException(这实际上是合理的,考虑它)。 有些HTTP客户端确实接受了简短的响应,并报告了导致我的成功结果代码,可能不公平地将手指指向HttpURLConnection。

我改变了我的服务器,而不是(添加内容长度为好措施):

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

没有更多的EOFException与该代码。 有可能“连接:closures”解决scheme在某些服务器上触发某些行为(例如确保响应在closures之前有效),但是Python的SimpleHTTPServer并不是这样,而根本原因竟然是我的错。

注意:Android pre-Froyo(2.2)有一些与保持连接有关的bug,但是我不认为这个问题有足够的信息来声明新版本的Android bug。

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

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

我使用google-api-java-client NetHttpTransport,所以如何设置RequestProperty并不是很明显,我转而使用ApacheHttpTransport,问题就没有了。