2014-01-23 4 views
3

HttpURLConnection 오류 (피어의 연결 재설정)

문제 : "연결"을 시도 할 때 간헐적이지만 자주 실패합니다. 코드, 디버그 메시지 및 스택 추적은 아래와 같습니다. 유사한 질문 답변을 보았습니다. android 개발자의 도움을 받았지만 실패에 대한 답변은 입니다.

도움을 주시면 감사하겠습니다.

하는 코드 :

public String doInBackground (String... urlArray) { 
String string; 
InputStream is = null; 
int responseCode = 0; 

Log.d("Data", "doInBackground "); 
try { 
    URL url = new URL(urlArray[0]); 
    // Create a new HTTP URL connection 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    Log.d("Data", "connection= " + connection); 
    connection.setConnectTimeout(10000); 
    connection.setReadTimeout(10000); 
    connection.setDoInput(true); 
    connection.connect(); 

    responseCode = connection.getResponseCode(); 
    Log.d("Data", "responseCode= " + responseCode); 
    if (responseCode == HttpURLConnection.HTTP_OK) { 
     is = connection.getInputStream(); 
     int len=50000; 
     string = readIt(is, len); 
     connection.disconnect(); 
     is.close(); 
     return string; 
     } 
     else { 
     connection.disconnect(); 
     return "File Not Found"; 
     } 
} 
catch (IOException e) { 
Log.d("Data", "e.getCause()= " + e.getCause()); 
Log.d("Data", "e.getMessage()= " + e.getMessage()); 
e.printStackTrace(); 
return null; 
} 
} 
 
Debug messages when it works: 

01-23 11:57:00.029: D/Data(21987): doInBackground 
01-23 11:57:00.029: D/Data(21987): connection= com.android.okhttp.internal.http.HttpURLConnectionImpl:http://finance.yahoo.com/d/quotes.csv?s=^GSPC+^GSPTSE+^IXIC+^NDX+^TNX&f=snxl1d1t1c1ohgv&ignore=.csv 
01-23 11:57:00.549: D/Data(21987): responseCode= 200 
01-23 11:57:00.549: D/Data(21987): readIt start 
01-23 11:57:00.609: D/Data(21987): readIt end 
01-23 11:57:00.609: D/Data(21987): onPostExecute start 
01-23 11:57:00.629: D/Data(21987): onPostExecute end 

Debug messages when it fails: 
============================= 
01-23 11:57:03.839: D/Data(21987): doInBackground 
01-23 11:57:03.839: D/Data(21987): connection= com.android.okhttp.internal.http.HttpURLConnectionImpl:http://finance.yahoo.com/d/quotes.csv?s=^GSPC+^GSPTSE+^IXIC+^NDX+^TNX&f=snxl1d1t1c1ohgv&ignore=.csv 
01-23 11:57:05.939: D/Data(21987): e.getCause()= libcore.io.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer) 
01-23 11:57:05.939: D/Data(21987): e.getMessage()= recvfrom failed: ECONNRESET (Connection reset by peer) 
01-23 11:57:05.979: D/Data(21987): onPostExecute start 
01-23 11:57:06.009: D/Data(21987): onPostExecute end 


The print stack trace: 
============================= 
01-23 11:57:05.939: W/System.err(21987): java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) 
01-23 11:57:05.949: W/System.err(21987): at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:545) 
01-23 11:57:05.949: W/System.err(21987): at libcore.io.IoBridge.recvfrom(IoBridge.java:509) 
01-23 11:57:05.949: W/System.err(21987): at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 
01-23 11:57:05.949: W/System.err(21987): at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
01-23 11:57:05.949: W/System.err(21987): at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 
01-23 11:57:05.949: W/System.err(21987): at java.io.InputStream.read(InputStream.java:162) 
01-23 11:57:05.949: W/System.err(21987): at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142) 
01-23 11:57:05.949: W/System.err(21987): at java.io.BufferedInputStream.read(BufferedInputStream.java:227) 
01-23 11:57:05.949: W/System.err(21987): at com.android.okhttp.internal.Util.readAsciiLine(Util.java:316) 
01-23 11:57:05.959: W/System.err(21987): at com.android.okhttp.internal.http.RawHeaders.fromBytes(RawHeaders.java:308) 
01-23 11:57:05.959: W/System.err(21987): at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:135) 
01-23 11:57:05.959: W/System.err(21987): at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:644) 
01-23 11:57:05.959: W/System.err(21987): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:347) 
01-23 11:57:05.959: W/System.err(21987): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 
01-23 11:57:05.959: W/System.err(21987): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503) 
01-23 11:57:05.959: W/System.err(21987): at com.retepcivorodot.stockcharts.QuoteListFragment$MyAsyncTask.doInBackground(QuoteListFragment.java:949) 
01-23 11:57:05.959: W/System.err(21987): at com.retepcivorodot.stockcharts.QuoteListFragment$MyAsyncTask.doInBackground(QuoteListFragment.java:1) 
01-23 11:57:05.959: W/System.err(21987): at android.os.AsyncTask$2.call(AsyncTask.java:288) 
01-23 11:57:05.969: W/System.err(21987): at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
01-23 11:57:05.969: W/System.err(21987): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
01-23 11:57:05.969: W/System.err(21987): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
01-23 11:57:05.969: W/System.err(21987): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
01-23 11:57:05.969: W/System.err(21987): at java.lang.Thread.run(Thread.java:841) 
01-23 11:57:05.969: W/System.err(21987): Caused by: libcore.io.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer) 
01-23 11:57:05.979: W/System.err(21987): at libcore.io.Posix.recvfromBytes(Native Method) 
01-23 11:57:05.979: W/System.err(21987): at libcore.io.Posix.recvfrom(Posix.java:141) 
01-23 11:57:05.979: W/System.err(21987): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164) 
01-23 11:57:05.979: W/System.err(21987): at libcore.io.IoBridge.recvfrom(IoBridge.java:506) 
01-23 11:57:05.979: W/System.err(21987): ... 21 more 

답변

1

난 당신이 특정 요청을 재현 할 수있는 경우에만,이 코드와는 아무 상관이 없다는 것을 확신 해요.

ECONNRESET은 서버 (방화벽 일 수도 있음)에 의해 연결이 끊어 졌음을 의미합니다.

요청의 약 50 %에서 한 번 동일한 문제가 발생했으며 가상 IP 매핑과 관련하여 클러스터의 한면에 하드웨어 결함이있는 것으로 나타났습니다. 로드 밸런서가 요청을 왼쪽으로 전달하기로 결정했을 때로드 밸런서가 작동하고 오른쪽으로 실패했습니다.

귀하의 요청과 성공/실패 사이에 상관 관계가 있는지 확인하십시오. 어쩌면 어떤 종류의 응용 프로그램 방화벽이 특정 요청을 할 때 연결을 끊을 수 있습니다. 아마도 서비스 거부 보호가 ...

성공/실패가 절대적으로 무작위이면 안드로이드 전화와 Yahoo 서버 사이의 장치가 고장 났을 것입니다.

그리고 응답을받을 때까지 요청을 제출하는 데 걸리는 시간을 추적 할 수 있습니다. 실패한 요청은 항상 더 많은 시간이 걸립니까? 나는 여러분이 호출중인 REST 서비스의 웹 서버 큐가 가득 차면 연결을 끊을 것이라고 상상할 수있다. 대부분의 웹 서버가 HTTP 코드 503으로 응답하기 때문에로드 밸런서 또는 방화벽으로도이 작업을 수행 할 수 있습니다.