2013-01-22 52 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

这是干什么的?不可能观察任何可能解决问题的东西。 –

相关问题