1

내가 HTTP를 통해 그것을 사용하는 경우HttpsURLConnection는 EOFException는 내가 게시물에 대한 다음 코드를 사용하고

public String executeHttpPost(String uri, String data) { 

    HttpURLConnection conn = null; 
    URL url = null; 
    String s = null; 

    try { 

     url = new URL(uri); 

     conn = (HttpURLConnection) url.openConnection(); 

     if (conn instanceof HttpsURLConnection) { 
      Log.d("HTTPS", "HttpsUrl"); 
     } 

     conn.setDoOutput(true); 
     conn.setDoInput(true); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

     OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
     wr.write(data); 
     wr.flush(); 

     DisplayResponseHeaders(conn); 

     s = readStream(conn.getInputStream()); 
     Log.d("body", s); 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     s = null; 
     e.printStackTrace(); 
    } finally { 
     conn.disconnect(); 
    } 
    return s; 
    } 

요청, 모두 잘 작동하지만, HTTPS를 통해 난에 대해 문제를 발견

java.io.EOFException 
at libcore.io.Streams.readAsciiLine(Streams.java:203) 
at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:573) 
at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:821) 
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283) 
libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177) 
libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271) 
ru.fors.remsmed.fragment.NetHelper.executeHttpPost(NetHelper.java:234) 
ru.fors.remsmed.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:424) 
ru.fors.remsmed.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:1) 
android.os.AsyncTask$2.call(AsyncTask.java:287) 
java.util.concurrent.FutureTask.run(FutureTask.java:234) 
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
java.lang.Thread.run(Thread.java:856) 
threadid=14: thread exiting with uncaught exception (group=0x40a71930) 

수 httpsurlconnection 및 가능한 해결책의 연결 재사용 버그 :

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

그러나 저에게는 효과가 없습니다.

답변

1

시도는 다음과 같이 코드를 변경합니다 :

conn.setRequestProperty("Content-Type", 
          "application/x-www-form-urlencoded; charset: UTF-8"); 
    byte[] output = data.getBytes("UTF-8"); 
    conn.setFixedLengthStreamingMode(output.length); 

    os = conn.getOutputStream(); 
    os.write(output); 
    os.flush(); 
    os.close(); 

    DisplayResponseHeaders(conn); 

    if (conn.getResponseCode() == 200) { // or other 2xx code like 204 

     s = readStream(conn.getInputStream()); 
     Log.d("body", s); 
    } 
    else { 

     // handle error conditions like 404, 400, 500, ... 

     // now it may be necessary to read the error stream 

     InputStream errorStream = conn.getErrorStream(); 

     // ... 
    } 

모든 당신이 열 항상 가까운 스트림해야 AFAIK. 나는 conn.disconnect()이 당신을 위해 그것을하고 있는지 확실하지 않습니다.

HTTP (S) 요청을 더 편리하게 코딩하려면 DavidWebb을보고 성가신 HttpURLConnection 사용을 피하는 데 도움이되는 라이브러리 목록이 있어야합니다.

0

그 EOFException은 응답이 잘못되었음을 제안합니다. 아마도 헤더 뒤에 빈 줄이 없을 것입니다. 어떤 경우에는 HTTP 클라이언트 코드가 더 용서가된다. iOS가 내 서버 응답을 잘 처리 할 수 ​​있지만 HttpURLConnection을 사용하여 Android에서 EOFException을 받고있다.

내 서버가 파이썬 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는 :

내가 대신이 일을 내 서버를 변경했습니다. "Connection : close"솔루션이이 문제를 해결할 수있는 특정 서버에서 일부 동작을 유발할 수 있습니다 (예 : 응답이 닫히기 전에 유효하다는 것을 확인).하지만 Python SimpleHTTPServer에서는 그렇지 않으며 근본 원인은 내 잘못.

NB : Keep-Alive 연결과 관련된 Android pre-Froyo (2.2)에는 몇 가지 버그가 있습니다. 블로그 게시물 (http://android-developers.blogspot.co.uk/2011/09/androids-http-clients.html)을 참조하십시오. 나는 아직 안드로이드의 새로운 버전으로 버그의 확실한 증거를 보지 않고있다.