2013-03-14 71 views
39

我有一个问题,当我尝试读取任何输入时,我的HttpsURLConnection将引发EOFException。该代码适用于某些网络呼叫,但在其他网络上失败。如果我尝试从连接中读取任何内容,则会出现上述错误。Android 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"); 
} 

谢谢!

里克

+1

您不需要检查Build.VERSION.SDK,因为您没有使用它。 – 2013-05-20 06:50:12

+0

urlConnect.setRequestProperty(“Connection”,“close”); – 2013-05-22 18:45:06

+0

它适合我,魔术!感谢你的帖子。 – 2013-05-22 18:45:37

回答

41

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

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

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

为什么哦为什么????? – 2014-06-10 08:30:24

+0

这应该去哪里? – zundi 2014-11-17 02:39:00

+0

如果您没有检查Build.VERSION.SDK_INT,该怎么办? – 2015-03-01 07:55:41

0

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

1

您不指定您的服务器,因此可能是您自己实施的自定义服务器。 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() 

没有更多EOFException,使用该代码。有可能“连接:关闭”解决方案在某些服务器上触发某些行为(例如,确保响应在关闭之前有效),但python SimpleHTTPServer并非如此,根本原因竟然是我的错。

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

1

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

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