Apache Commons Net FTPClient不会执行listFiles()

时间:2015-12-11 02:07:42

标签: java ftp ftps apache-commons-net

我正在修改一些以前使用我自己编写的FTPS库的代码。我被要求开始使用Apache Commons Net库(主要是FTPClient和FTPSClient),我遇到了进行文件列表的问题。我已经阅读了其他问题,这不是enterLocalPassiveMode问题(Apache Commons Net FTPClient and listFiles()),因为我在连接之后但在登录之前使用它。相同的代码在我设置的测试服务器上正常工作(也使用Apache FTP),但在我需要它的服务器上不起作用。

我也尝试过使用“PBSZ 0”和“PROT P”命令,但它们并没有在远程系统上实现。

502 PBSZ Command not implemented.
502 PROT Command not implemented.

代码:

FTPSClient ftpsclient = new FTPSClient(true); // Implicit SSL
ftpsclient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true));
ftpsclient.connect(HOST_ADDR, HOST_PORT); // Using port 990
ftpsclient.enterLocalPassiveMode();
ftpsclient.user(USERID);
ftpsclient.pass(PASSWORD);
ftpsclient.setFileType(FTP.BINARY_FILE_TYPE);
ftpsclient.changeWorkingDirectory(REMOTE_DIR);
ftpsclient.printWorkingDirectory();
FTPFile[] ftpfiles = ftpsclient.listFiles(); // This is where it breaks

我已尝试明确指定目录并使用默认值:

FTPFile[] ftpfiles = ftpsclient.listFiles();
FTPFile[] ftpfiles = ftpsclient.listFiles(REMOTE_DIR);

......但两者都给出了相同的结果。这是调试信息的输出:

220 FTPS (Version  Thu Dec 10 17:23:00 2015) server ready.
USER ****
331 Password required for ****.
PASS ****
230 User **** logged in.
TYPE I
200 Type set to I
CWD outbound/directory
250 CWD Command successful.
PWD
257 "/usr/path/to/outbound/directory" is current directory.
SYST
215 UNIX
PASV
227 Entering Passive Mode (XX,XX,XX,XX,24,140) ***Edit: port 6284
LIST
150 Opening data connection for '/bin/ls'.

然后在30秒后使用此堆栈跟踪超时:

Stack Trace: org.apache.commons.net.ftp.FTPConnectionClosedException: Connection closed without indication.
    at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:317)
    at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:294)
    at org.apache.commons.net.ftp.FTP.getReply(FTP.java:692)
    at org.apache.commons.net.ftp.FTPClient.completePendingCommand(FTPClient.java:1813)
    at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:3308)
    at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:3271)
    at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2930)

我已经检查了我的防火墙设置,并允许该主机通过端口990和6200-6300进行连接。

我还阅读了FTPClient.listFiles not workingJava application hanging during LIST command to FTP Server (Apache Commons FTPClient),但这些都没有帮助解决我的问题。

编辑:看起来好像FTPClient没有识别数据通道。我尝试上传文件而不是列表,并在“150打开数据连接”消息后死亡。我已经确认,防火墙不会阻止从PASV命令分配给数据连接的端口。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我修好了。事实证明我正在使用无效路径进行目录列表。 Apache FTP没有返回错误消息,而是关闭了连接。不知道为什么。无论如何,它现在正在工作。