查找java.io.IOException的确切原因和解决方案:远程主机强制关闭了现有连接



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

我的问题如下:

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

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) 

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

否。本地主机接收到来自对等端的RST。如果Internet连接中断,这将导致本地TCP中止连接,最终会显示不同的消息,如"软件导致连接中止"或"连接被本地主机中的软件中止",无论系统上的确切措辞如何。如果它说"通过远程主机",那就是它的意思。

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

不是。

如何参数化FTPClient或底层套接字以重试并恢复连接?

我无法为FTPClient应答,但发生此异常的Socket已终止,必须关闭。它无法重试任何操作。

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

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

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

最新更新