2016-12-21 97 views
0

我到處搜索,無法解決我的問題。我的AsyncTask,在doInBackground我:發送POST請求並閱讀響應。 IOException當conn.getInputStream()

protected Void doInBackground(byte[]... params) { 
try { 
    URL url = new URL(stringURL); 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
    // Allow Inputs 
    conn.setDoInput(true); 
    // Allow Outputs 
    conn.setDoOutput(true); 
    // Don't use a cached copy. 
    onn.setUseCaches(false); 
    // Use a post method. 
    conn.setRequestMethod("POST"); 
    conn.setRequestProperty("Content-Type", "text/html; charset=UTF-8"); 
    conn.setRequestProperty("Connection", "Keep-Alive"); 
    conn.setRequestProperty("Accept", "text/html"); 
    conn.setRequestProperty("Content-Length", params[0].length); 

    OutputStream out = conn.getOutputStream(); 
    out.write(params[0]); 
    out.flush(); 
    out.close(); 

    InputStream is = conn.getInputStream(); 
    int ch; 
    StringBuffer b =new StringBuffer(); 
    while((ch = is.read()) != -1){ 
     b.append((char)ch); 
    } 
    String s = b.toString(); 

}catch (IOException e) { 
    e.printStackTrace(); 
} 

我打電話給我的異步任務這樣的:new httpRequestResponseTask().execute(byteArray);

我成功發送請求後,我嘗試讀取響應我得到 每一次都java.io.IOException: unexpected end of stream on Connection... 當我打電話conn.getInputStream()。當我撥打 conn.getResponseCode()conn.getResponseMessage()時,我會得到同樣的例外。

我可以看到服務器獲取我的請求併成功發送響應。但我沒有得到它。

我試過很多認爲(其中一些瘋狂的),只是爲了測試,如:

*我把conn.connect();設置屬性 - 同IOException異常

*不關閉的OutputStream - 同IOException異常

*加入大超時像

 conn.setReadTimeout(30000); 
    conn.setConnectTimeout(35000); 

的反應應該是57個字節,因此超時已經足夠了。 沒有變化。

*我嘗試使用url.OpenStream()取InputStream。它只是掛起,沒有任何事情發生。

*我嘗試了不同的屬性,如Accept-Encoding和較少的屬性。

*我查了網址,裏面沒有空格。網址是這樣的: http://example.com:8080

我沒有代理。我使用我的個人手機作爲Wi-Fi熱點,並使用手機測試該程序。這是與android 6.0,但該項目設置爲4.4 kitkat。

我應該等什麼或做別的事嗎?我的想法......

UPDATE異常堆棧

沒有Content-Length的

12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err: java.io.IOException: unexpected end of stream on Connection{example.com:8080, [email protected] hostAddress=*.*.*.* cipherSuite=none protocol=http/1.1} (recycle count=0) 
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err:  at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:210) 
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err:  at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80) 
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err:  at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:918) 
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err:  at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:802) 
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:460) 
12-21 14:38:09.516 5481-5572/com.xmltestservers W/System.err:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err:  at com.xmltestservers.MainActivity$RetrieveFeedTask.doInBackground(MainActivity.java:172) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err:  at com.xmltestservers.MainActivity$RetrieveFeedTask.doInBackground(MainActivity.java:125) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:295) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err:  at java.lang.Thread.run(Thread.java:818) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: Caused by: java.io.EOFException: \n not found: size=0 content=... 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err:  at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:200) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err:  at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191) 
12-21 14:38:09.517 5481-5572/com.xmltestservers W/System.err: ... 14 more 

隨着內容長度

12-21 14:40:42.783 7729-7837/com.xmltestservers W/System.err: java.io.IOException: unexpected end of stream on Connection{example.com:8080, [email protected] hostAddress=*.*.*.* cipherSuite=none protocol=http/1.1} (recycle count=0) 
12-21 14:40:42.784 7729-7837/com.xmltestservers W/System.err:  at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:210) 
12-21 14:40:42.785 7729-7837/com.xmltestservers W/System.err:  at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80) 
12-21 14:40:42.785 7729-7837/com.xmltestservers W/System.err:  at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:918) 
12-21 14:40:42.785 7729-7837/com.xmltestservers W/System.err:  at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:802) 
12-21 14:40:42.786 7729-7837/com.xmltestservers W/System.err:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:460) 
12-21 14:40:42.786 7729-7837/com.xmltestservers W/System.err:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405) 
12-21 14:40:42.786 7729-7837/com.xmltestservers W/System.err:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231) 
12-21 14:40:42.786 7729-7837/com.xmltestservers W/System.err:  at com.xmltestservers.MainActivity$RetrieveFeedTask.doInBackground(MainActivity.java:169) 
12-21 14:40:42.786 7729-7837/com.xmltestservers W/System.err:  at com.xmltestservers.MainActivity$RetrieveFeedTask.doInBackground(MainActivity.java:125) 
12-21 14:40:42.787 7729-7837/com.xmltestservers W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:295) 
12-21 14:40:42.787 7729-7837/com.xmltestservers W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
12-21 14:40:42.787 7729-7837/com.xmltestservers W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
12-21 14:40:42.787 7729-7837/com.xmltestservers W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
12-21 14:40:42.788 7729-7837/com.xmltestservers W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
12-21 14:40:42.788 7729-7837/com.xmltestservers W/System.err:  at java.lang.Thread.run(Thread.java:818) 
12-21 14:40:42.788 7729-7837/com.xmltestservers W/System.err: Caused by: java.io.EOFException: \n not found: size=57 content=f1f1f1340079c1eed5d9043324501c4ae6700647e093ea8a18b2e42c9d2acbd8... 
12-21 14:40:42.789 7729-7837/com.xmltestservers W/System.err:  at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:200) 
12-21 14:40:42.790 7729-7837/com.xmltestservers W/System.err:  at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191) 
12-21 14:40:42.790 7729-7837/com.xmltestservers W/System.err: ... 14 more 
+0

從這裏檢查郵政方法https://readyandroid.wordpress.com/get-and-post-request-using-default-http-client/ –

+0

我的代碼是做同樣的事情,像postJson方法,它不工作。唯一的區別是他的Content-Type是application/json,而我的是text/html。我這樣做就像這樣https://www.mkyong.com/java/how-to-send-http-request-getpost-in-java/,我仍然得到相同的IOException – Georgi

+0

您正在發佈html內容作爲字節數組? –

回答

0

事實證明,答覆沒有任何標題,我認爲這是問題所在。我試了HTTPClient,並沒有工作,因爲響應中沒有頭(我認爲這個異常不是有效的HTTP響應)。之後,我嘗試使用Socket,它工作。下面是代碼:

Socket socket = new Socket(url.getHost(), url.getPort()); 
DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
out.write(hardcodedRequest); 
out.flush(); 

InputStream inStream = socket.getInputStream(); 

byte[] resp = new byte[hardcodedResponse.length]; 
int res = inStream.read(resp); 

//Check if the response is the correct one. 
if (!Arrays.equals(resp, hardcodedResponse) && res != hardcodedResponse.length) { 

} 
out.close(); 

我知道什麼是響應suppost是,所以我硬編碼它,並將它與服務器的響應比較。

0

試試這個代碼讀取響應

BufferedReader in = new BufferedReader(
      new InputStreamReader(con.getInputStream())); 
    String inputLine; 
    StringBuffer response = new StringBuffer(); 

    while ((inputLine = in.readLine()) != null) { 
     response.append(inputLine); 
    } 
    in.close(); 
+0

只需測試一下。相同的IOException。我也嘗試過'InputStream responseStream = new BufferedInputStream(con.getInputStream());' – Georgi

+0

當你將它作爲參數傳遞時,字節數組需要被編碼爲「UTF-8」,所以如果你從字符串中提取它, stringVar.getBytes(「UTF-8」)方法 – Elgayed

+0

我的byte []被硬編碼爲57個字節。 – Georgi