java.net.SocketException:recvfrom失败:ECONNRESET(连接由对等方重置)

问题描述 投票:0回答:1

我在 Android 中有一个 HTTP 服务器。我为每个 HTTP 请求创建一个新线程,如提到的链接中所示:

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();
        }         
          }
    }
}

知道为什么会发生这种情况或如何解决吗?

android httpconnection
1个回答
2
投票

当我使用以下代码片段将 DefaultHttpServerConnection 属性传递给 handle() 方法时,我没有收到此异常:

在WorkerThread类中,使用以下代码传递DefaultHttpServerConnection连接对象:

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

在handle()方法中,使用以下方法获取连接对象,

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

希望它对某人有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.