【发布时间】:2016-03-16 20:45:02
【问题描述】:
我正在修改一些以前使用我自己编写的 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 working 和Java application hanging during LIST command to FTP Server (Apache Commons FTPClient),但这些都没有帮助解决我的问题。
编辑:似乎 FTPClient 无法识别数据通道。我尝试上传文件而不是列表,但在“150 正在打开数据连接”消息后它就死了。我已经确认通过 PASV 命令分配给数据连接的端口没有被我们的防火墙阻止。
有什么想法吗?
【问题讨论】:
-
你可以用一个独立的 FTP 客户端从同一台机器连接到同一台服务器使用被动模式吗?
-
我目前正在尝试查看是否可以使用 cURL 进行连接,但本地计算机是我无法控制的 AIX 服务器。
标签: java ftp ftps apache-commons-net