2013-02-28 134 views
1

我們正在使用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的數據包,但在我們的實現,我們不會發送這樣的數據包。我們認爲這可能是問題的原因,但我們不確定如何解決問題。

回答

0

我會問你實際運行的代碼以獲取更多細節。

但作爲初步迴應,因爲我有類似的問題,請檢查apache commons是不是真的以面向對象的方式構建請求,而是在您調用它時將每個命令發送到服務器(例如,調用ftpClient.enterLocalPassiveMode )將立即發送PASV),這可能會造成一些混淆。 就此而言,在這種情況下,錯誤發生的可能性越大,在適當的時間(連接後,登錄前)就不會進入被動模式。

如果listnames不起作用可能什麼都不起作用。

+0

事實證明,FTP服務器並未遵循該協議,所以apache.commons提前終止了連接。 你的回答實際上對我有幫助,謝謝@ fd8s0 – Eric 2013-03-19 23:08:14