我尝试在我的应用程序中使用 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
最佳答案
似乎相关的区别是 sun.net.ftp.FtpClient
默认使用被动 (PASV
) 模式,但 org.apache.commons .net.ftp.FTPClient
默认为 Activity 状态。
至少,这是我对相应源代码的阅读:
- http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/sun/net/ftp/impl/FtpClient.java#FtpClient.0passiveMode (第 79 行)
- https://commons.apache.org/proper/commons-net/apidocs/src-html/org/apache/commons/net/ftp/FTPClient.html (第491行)
您应该能够通过运行来确认这一点:
FtpClient ftp = FtpClient.create("host");
ftp.login("account", "password".toCharArray());
ftp.enablePassiveMode(false);
ftp.listFiles("path");
您应该能够在 Apache FTP 客户端中使用 PASV 模式(也称为本地被动模式);请参阅javadocs .
关于java - apache ftpclient 和 sun ftpclient 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48093845/