【问题标题】:Looking for exact cause and resolution of : java.io.IOException: An existing connection was forcibly closed by the remote host寻找确切的原因和解决方法:java.io.IOException: An existing connection was forcefully closed by the remote host
【发布时间】:2018-04-29 04:12:36
【问题描述】:

LOCAL_PASSIVE_MODE 中使用 Apache FTPClient 引发异常。该过程是从远程站点的 PC 通过卫星连接运行的,我知道这不太稳定。相同的代码在与同一台服务器的稳定连接上完美运行,但我不确定差异是来自连接的稳定性还是速度(即服务器配置的超时)

我的问题如下:

  • 是否一定是远程主机关闭了连接(如异常中所述),或者中断的 Internet 连接是否会产生相同的异常?
  • 如果 Internet 连接中断确实会导致此异常,我该如何参数化 FTPClient 或底层 Socket 以重试并恢复连接?
  • 如何测试连接是否被远程服务器关闭或中断?

FTPClient 配置为:

  • 连接超时:10 分钟
  • 数据超时:10 分钟
  • 保持活动状态:已启用
  • 每 10 秒发送一次保持活动信号
  • 从服务器超时保持活动回复:10 分钟
  • FTP 缓冲区大小:1024 x 1024

我正在等待接收服务器配置文件和服务器日志。

堆栈跟踪如下:

java.io.IOException: An existing connection was forcibly closed by the remote host 
    at sun.nio.ch.SocketDispatcher.read0(Native Method) 
    at sun.nio.ch.SocketDispatcher.read(Unknown Source) 
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source) 
    at sun.nio.ch.IOUtil.read(Unknown Source) 
    at sun.nio.ch.SocketChannelImpl.read(Unknown Source) 
    at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:317) 
    at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:45) 
    at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:683) 
    at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:659) 
    at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:648) 
    at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:68) 
    at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1120) 
    at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    是否一定是远程主机关闭了连接(如异常中所述),或者中断的互联网连接是否会产生相同的异常?

    没有。本地主机收到来自对等方的 RST。如果 Internet 连接中断,这将导致本地 TCP 中止连接,最终会出现不同的消息,例如“软件导致连接中止”或“连接被本地主机中的软件中止”,无论确切的措辞在您的系统上。如果它说'by the remote host',那就意味着它。

    如果中断的互联网连接确实会导致此异常

    不是。

    如何参数化 FTPClient 或底层 Socket 以重试和恢复连接?

    我无法回答 FTPClient,但出现此异常的 Socket 已死,必须关闭。它无法重试任何操作。

    更重要的是要检查为什么对等方中止连接。例如,您可能违反了上传大小限制。

    如何测试连接是否被远程服务器关闭或中断?

    不幸的是,通过错误消息。他们本可以将套接字中可能出现的各种errno 值映射到不同的IOException 或实际上是SocketException 子类,但他们只在少数情况下这样做,例如ConnectExceptionSocketTimeoutException...

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 2017-01-29
      • 2023-02-16
      • 1970-01-01
      • 2015-10-31
      • 2021-09-18
      • 2019-11-04
      • 2021-08-19
      • 2020-12-18
      相关资源
      最近更新 更多