我尝试在我的应用程序中使用ftp客户端
第一个我使用org.apache.commons.net.ftp.FTPClient
但在linux服务器上运行时
可以登录ftp服务器,无法获取文件列表
返回消息是425无法建立连接。
如果关闭防火墙可以正常工作
好吧,我尝试更改为sun.net.ftp.FtpClient
发生了惊人的事情
我可以获得文件列表
两者都是主动模式,有谁知道为什么会有这样的差异?
FTPClient ftpClient = new FTPClient();
ftpClient.connect("host");
ftpClient.login("account", "password");
ftpClient.listFiles("path"); // can't work if you not open firewall
FtpClient ftp = FtpClient.create("host");
ftp.login("account", "password".toCharArray());
ftp.listFiles("path"); // even if you do not open the firewall can work
答案 0 :(得分:1)
似乎相关的差异是sun.net.ftp.FtpClient
默认使用被动(PASV
)模式,但org.apache.commons.net.ftp.FTPClient
默认为有效。
至少,这是我阅读各自的源代码:
您应该可以通过运行来确认:
FtpClient ftp = FtpClient.create("host");
ftp.login("account", "password".toCharArray());
ftp.enablePassiveMode(false);
ftp.listFiles("path");
您应该能够在Apache FTP客户端上使用PASV模式(也称为本地被动模式);请参阅javadocs。