FTPS客户端中listNames()期间的套接字超时

时间:2013-02-28 00:31:21

标签: java ftp ftp-client apache-commons-net ftps

我们正在使用apache.commons.net v.2.2编写自己的FTPS客户端,我们一直在尝试在apache.commons.net.ftp.FTPClient中使用listNames(),但它在apache.commons中超时。 net.ftp.FTPListParseEngine.java第152行

    String line = this.parser.readNextEntry(reader);

我们需要客户端使用TLS进行身份验证,然后在传输数据之前切换到CCC模式。我们能够连接到服务器并获取当前工作目录,但LIST / RETR命令超时。 这是我们当前实施的日志:

FTPS: Connecting to: XXXXXXXXXXXXXXXXX.com
FTPS: REPLY: 220 UNAUTHORIZED ACCESS TO THIS SYSTEM IS STRICTLY PROHIBITED.
FTPS: COMMAND: AUTH TLS
FTPS: REPLY: 234 AUTH TLS-C/TLS OK.
FTPS: Switching to passive mode in the middle of a session
FTPS: Logging in with user: XXXXXXXXX
FTPS: COMMAND: USER XXXXXXXXXXXX
FTPS: REPLY: 331 Password required for XXXXXXXXXXX.
FTPS: COMMAND: PASS **********
FTPS: REPLY: 230 Connect:Enterprise UNIX login ok, access restrictions apply.
FTPS: COMMAND: PBSZ 0
FTPS: REPLY: 200 PBSZ 0 OK.
FTPS: COMMAND: PROT P
FTPS: REPLY: 200 PROT P OK, data channel will be secured.
FTPS: Dropping to CCC mode
FTPS: COMMAND: CCC
FTPS: REPLY: 200 CCC Context Enabled.
FTPS: Setting Transfer Type to Binary
FTPS: COMMAND: TYPE I
FTPS: REPLY: 200 Type set to I.
FTPS: COMMAND: SYST
FTPS: REPLY: 215 UNKNOWN Type: L8
ftpClient.getSystemType() UNKNOWN Type: L8
FTPS: COMMAND: PWD
FTPS: REPLY: 257 "/XXXXXXXXXXXXX" is current directory.
FTPS: COMMAND: PASV
FTPS: REPLY: 227 Entering Passive Mode (XXX,XXX,XXX,XXX,XXX,XXX)
FTPS: COMMAND: LIST
FTPS: REPLY: 150 Opening BINARY mode data connection for ...
FTPS: java.lang.RuntimeException: java.net.SocketTimeoutException: Read timed out

在Wireshark中,我们注意到其他客户端在打开数据连接后立即发送了一个FTP-DATA数据包,但在我们的实现中,我们不发送此类数据包。我们认为这可能是问题的原因,但我们不确定如何解决它。

1 个答案:

答案 0 :(得分:0)

我会询问您实际运行的代码以获取更多详细信息。

但作为初步响应,由于我遇到了类似的问题,请检查apache commons是否真的以面向对象的方式构建请求,而是在调用它时将每个命令发送到服务器(例如,调用ftpClient.enterLocalPassiveMode()将立即发送PASV),这可能会产生一些混乱。 在这方面,在这种情况下更有可能的错误是在正确的时间没有进入被动模式(在连接之后,在登录之前)。

如果列表名不起作用,则可能无效。