2013-03-14 57 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。

確保您的請求有效後,嘗試其他人提供的解決方案。