2013-01-22 3 views
4

Android에 HTTP 서버가 있습니다. 언급 된 링크에서와 같이 각 HTTP 요청에 대해 새 스레드를 만듭니다.java.net.SocketException : recvfrom 실패 : ECONNRESET (동료에 의한 연결 재설정)

http://hc.apache.org/httpcomponents-core-ga/httpcore/examples/org/apache/http/examples/ElementalHttpServer.java.

나는 가끔 다음과 같이 예외를 얻고, 여러 GET 요청을 실행하면 :

01-22 10:28:22.779: W/System.err(2019): java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) 
01-22 10:28:22.779: W/System.err(2019):  at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:552) 
01-22 10:28:22.779: W/System.err(2019):  at libcore.io.IoBridge.recvfrom(IoBridge.java:516) 
01-22 10:28:22.779: W/System.err(2019):  at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 
01-22 10:28:22.779: W/System.err(2019):  at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)  
01-22 10:28:22.784: W/System.err(2019):  at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 
01-22 10:28:22.784: W/System.err(2019):  at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 
01-22 10:28:22.784: W/System.err(2019):  at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191) 
01-22 10:28:22.784: W/System.err(2019):  at org.apache.http.impl.io.HttpRequestParser.parseHead(HttpRequestParser.java:71) 
01-22 10:28:22.784: W/System.err(2019):  at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174) 
01-22 10:28:22.784: W/System.err(2019):  at org.apache.http.impl.AbstractHttpServerConnection.receiveRequestHeader(AbstractHttpServerConnection.java:141) 
01-22 10:28:22.784: W/System.err(2019):  at org.apache.http.protocol.HttpService.handleRequest(HttpService.java:135)  
01-22 10:28:22.784: W/System.err(2019):  at com.example.devicecommunication.ConnectService$WorkerThread.run(ConnectService.java:744)  
01-22 10:28:22.784: W/System.err(2019): Caused by: libcore.io.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer) 
01-22 10:28:22.784: W/System.err(2019):  at libcore.io.Posix.recvfromBytes(Native Method) 
01-22 10:28:22.784: W/System.err(2019):  at libcore.io.Posix.recvfrom(Posix.java:131) 
01-22 10:28:22.784: W/System.err(2019):  at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164) 
01-22 10:28:22.789: W/System.err(2019):  at libcore.io.IoBridge.recvfrom(IoBridge.java:513) 
01-22 10:28:22.789: W/System.err(2019):  ... 10 more 

난이 발생하는 이유를 모르겠습니다. 아래는 사용 된 코드이며이 예외는 handleRequest() 또는 conn.close()에서 발생합니다.

class WorkerThread extends Thread{ 
    HttpService httpService; 
    HttpServerConnection conn; 
    public WorkerThread(HttpService httpService, HttpServerConnection conn){ 
     super(); 
     this.httpService = httpService; 
     this.conn = conn; 
    }  
    public void run(){ 
     HttpContext context = new BasicHttpContext(null); 

     try { 
      Log.d(TAG,"Going to call Handle request here"); 
       this.httpService.handleRequest(this.conn, context);   
      } catch (ConnectionClosedException ex) { 
      ex.printStackTrace(); 
      Log.d(TAG,"Client closed connection exception"); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
      Log.d(TAG,"I/O exceptionnnnn " + ex.getMessage()); 
     } catch (HttpException ex) { 
      Log.d(TAG,"Unrecoverable HTTP protocol violation: " + ex.getMessage()); 
     } 
     finally { 
      Log.d(TAG,"Inside Finally Block"); 
      try {    
      this.conn.close(); 
      Log.d(TAG,"Connection closed successfully"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }   
      } 
    } 
} 

왜 이런 일이 발생하거나 어떻게 해결할 수 있습니까? 의의 WorkerThread 클래스에서

다음 코드를 사용하여 DefaultHttpServerConnection 연결 개체를 전달 : 나는 다음과 같은 코드를 사용하여 핸들() 메서드에 DefaultHttpServerConnection 속성을 통과

+0

링크 http://stackoverflow.com/questions/11207394/android-getting-socketexception-connection-reset-by-peer에 따르면 keepAlive를 false로 설정한다고합니다. 나는 System.setProperty ("http.KeepAlive", "false")를 시도했다; 여전히 문제는 지속됩니다. – user1741274

답변

2

,이 예외를하지 않았다

핸들() 메소드에서
HttpContext context = new BasicHttpContext(null); 
context.setAttribute("XXX",this.conn); 

는, 누군가를하는 데 도움이

(DefaultHttpServerConnection)context.getAttribute("XXX"); 

는 희망 사용하여 연결 개체를 얻을!

+2

이것은 무엇을합니까? –

+0

이것은 무엇을합니까? 문제를 해결 한 것으로 보이는 것은 관찰 할 수 없습니다. –