【发布时间】:2018-01-04 11:07:54
【问题描述】:
Apache 的FTPClient 无法下载 FileZilla 完美下载的文件。
基本上,我在成功登录并列出后要做的是下载一个特定文件:
FTPClient client = new FTPClient();
client.setDataTimeout(20000);
client.setConnectTimeout(20000);
client.setBufferSize(65536);
//...
client.connect(host);
client.login(user, pswd);
// response validation
client.enterLocalPassiveMode();
// some listings with validations
InputStream in = new BufferedInputStream(client.retrieveFileStream(ftpFilePath), 16384);
// ...
byte[] buffer = new byte[8192];
while ((rd = in.read(buffer)) > 0) {
// .. reading the file and updating download progress
最后几行可以很容易地替换为FTPClient的文件下载,结果几乎相同,但是我们无法跟踪下载进度:
client.setControlKeepAliveTimeout(30);
client.retrieveFile(ftpFilePath, new org.apache.commons.io.output.NullOutputStream());
作为所有这些操作的结果,我可以看到文件正在下载,直到非常接近 100%,然后出现异常:
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at <my code from here on>
似乎没有防火墙,但是当互联网连接速度更好时,下载成功(可能是某种超时)。我认为问题出在连接上,但问题是 FileZilla 成功下载了相同的文件。
所以,我可以这样重新表述我的问题:下载文件时如何让我的FTPClient 表现得像 FileZilla。可能有一些我不知道的复杂的 ping 逻辑重试。
公共网络:commons-net-3.6
FTP 服务器:CentOS 5.8 上的 proftpd-1.3.3g-6.el5,默认配置,不支持 FTP over TLS。
【问题讨论】:
标签: java ftp apache-commons-net