在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
值映射到不同的IOException
或SocketException
子类,但他们只在少数情况下这样做,如ConnectException
、SocketTimeoutException
。。。