org.apache.commons.net.ftp.FTPSClient 在列表命令后返回 425

Kor*_*gay 5 java apache ftp ftps apache-commons-net

我正在尝试连接到 FTPS 服务器。我可以很好地连接 FileZilla 并列出服务器中的文件、下载等。

在此输入图像描述

我正在尝试使用 org.apache.commons.net.ftp 包中的 FTPSClient 使用 Java 连接到此 FTP 服务器。这就是我正在尝试的方式:

FTPSClient ftp = new FTPSClient();
ftp.connect(HOST, 7021);
ftp.enterLocalPassiveMode();
ftp.login(USERNAME, PASSWORD);
final int list = ftp.list();
System.out.println("List returned: " + list);
Run Code Online (Sandbox Code Playgroud)

我得到的回应是:

FTPSClient ftp = new FTPSClient();
ftp.connect(HOST, 7021);
ftp.enterLocalPassiveMode();
ftp.login(USERNAME, PASSWORD);
final int list = ftp.list();
System.out.println("List returned: " + list);
Run Code Online (Sandbox Code Playgroud)

根据维基百科,425 的意思是:“无法打开数据连接”。

但是,尝试创建一个文件夹效果很好:

FTPSClient ftp = new FTPSClient();
ftp.connect(HOST, 7021);
ftp.enterLocalPassiveMode();
ftp.login(USERNAME, PASSWORD);
ftp.mkd("/laylaylom");
Run Code Online (Sandbox Code Playgroud)

因此,如果我运行此代码并连接 FileZilla,我将在 FTP 服务器中看到文件夹“laylaylom”。

我也尝试过:

FTPSClient ftp = new FTPSClient();
ftp.connect(HOST, 7021);
ftp.login(USERNAME, PASSWORD);
final int pasv = ftp.sendCommand("PASV");
System.out.println("pasv is: " + pasv);
final int list = ftp.list();
System.out.println("List returned: " + list);
Run Code Online (Sandbox Code Playgroud)

输出将是:

List returned: 425
Run Code Online (Sandbox Code Playgroud)

其中 227 是:“进入被动模式(h1,h2,h3,h4,p1,p2)。” 维基百科页面中没有列出 552,我不确定它代表什么。

我怎样才能list()工作?

编辑#1

在 Martin Prikryl 回答之后我尝试了这个:

FTPSClient ftp = new FTPSClient();
ftp.connect(HOST, 7021);
ftp.enterLocalPassiveMode();
ftp.login(USERNAME, PASSWORD);
final FTPFile[] ftpFiles = ftp.mlistDir("/");
System.out.println(ftpFiles.length);
Run Code Online (Sandbox Code Playgroud)

返回 0..

编辑 #2 WinSCP 日志:

FTPSClient ftp = new FTPSClient();
ftp.connect(HOST, 7021);
ftp.enterLocalPassiveMode();
ftp.login(USERNAME, PASSWORD);
ftp.mkd("/laylaylom");
Run Code Online (Sandbox Code Playgroud)

Mar*_*ryl 7

这个FTP.list方法太低级了。它甚至不打开数据连接。它只是发送LIST命令。您不能单独使用它。正如其文档所述:

一种向服务器发送 FTP LIST 命令、接收回复并返回回复代码的便捷方法。 请记住,由您来管理数据连接。如果您不需要这种低级别的访问权限,请使用FTPClient,它将为您处理所有低级别的详细信息。


相反,使用一些高级方法,例如:


并保持您的第一种方法,即调用FTPClient.enterLocalPassiveMode().

PASV仅通过向服务器发送命令无法切换到被动模式。您还必须切换客户端。否则客户端和服务器将无法相互通信。

FTPClient.enterLocalPassiveMode客户端和服务器都切换到被动模式。


当您使用 FTPS 时,您还需要启用加密数据传输。请注意,Apache Common Net 库默认情况下不加密数据传输。

ftp.execPBSZ(0);
ftp.execPROT("P").
Run Code Online (Sandbox Code Playgroud)

实际上,如果控制连接已加密,某些服务器(特别是您的服务器)甚至会要求您加密数据传输。