我创建了一个稍后使用的测试程序,它只是连接到服务器并检索文件,如下所示:
import org.apache.commons.net.ftp.*;
import java.io.*;
import java.net.SocketException;
public class Test {
private final String pass = [I removed this password];
FTPClient ftp;
File file = new File("download.txt");
private int reply;
FileOutputStream dfile;
public void ftp() {
try {
ftp = new FTPClient();
ftp.connect("ftp.bevilacqua.me");
ftp.login([i removed this username] ,[I removed this password]);
reply = ftp.getReplyCode();
if(FTPReply.isPositiveCompletion(reply)) {
System.out.println("Connected Success");
} else {
System.out.println("Connection unsuccessful");
ftp.disconnect();
}
if(file.exists()) {
System.out.println("File already exists");
}
dfile = new FileOutputStream(file);
ftp.retrieveFile("untitled.txt", dfile); //Untitled does exist in directory '/'
System.out.println("Success... maybe");
} catch(SocketException ex) {
ex.printStackTrace();
} catch(IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
Test main = new Test();
main.ftp();
try {
main.ftp.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
程序打印已连接成功并且文件已存在,因此它必须是检索文件。该程序不会崩溃,也不会抛出任何异常。
答案 0 :(得分:0)
我会先尝试这些:
1)被动模式(这指示客户端进行所有连接,而不是服务器) ftp.enterLocalPassiveMode();
2)数据超时(这应该停止无限期挂起,但是如果你设置的值太短,那么你可以挽救早期的慢连接)它难以模拟和测试 - 只需尝试一下。 ftp.setDataTimeout(10000); //十秒
最终有一种将protocolMessageHandler传递给底层套接字的方法,因此您应该能够记录客户端和服务器之间的聊天。我从来没有这样做过,但我想它很有可能揭露真正的问题。