我們正在使用apache.commons.net v.2.2編寫我們自己的FTPS客戶端,我們一直試圖在apache.commons.net.ftp.FTPClient中使用listNames(),但它是超時在apache.commons.net.ftp.FTPListParseEngine.java線152在FTPS客戶端的listNames()期間,套接字超時
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的數據包,但在我們的實現,我們不會發送這樣的數據包。我們認爲這可能是問題的原因,但我們不確定如何解決問題。
事實證明,FTP服務器並未遵循該協議,所以apache.commons提前終止了連接。 你的回答實際上對我有幫助,謝謝@ fd8s0 – Eric 2013-03-19 23:08:14