2013-01-22 118 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(); 
     }   
      } 
    } 
} 

任何想法爲什麼會發生這種情況或如何解決?

+0

根據鏈接http://stackoverflow.com/questions/11207394/android-getting-socketexception-connection-reset-by-peer,據說將keepAlive設置爲false。我試過System.setProperty(「http.KeepAlive」,「false」);仍然存在這個問題。 – user1741274

回答

2

當我通過DefaultHttpServerConnection屬性使用下面的代碼片段中的handle()方法,我沒有得到這個異常:

在的WorkerThread類,使用下面的代碼通過DefaultHttpServerConnection連接對象:

HttpContext context = new BasicHttpContext(null); 
context.setAttribute("XXX",this.conn); 

在handle()方法,用得到的連接對象,

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

希望它可以幫助別人!

+2

這是幹什麼的? –

+0

這是幹什麼的?不可能觀察任何可能解決問題的東西。 –

相關問題