2016-04-12 87 views
1

我創建了一個apache FTPS客戶端(因爲遠程服務器不允許普通的FTP)。我可以沒有問題地連接和刪除文件,但是當使用retrieveFile()或retrieveFileStream()時,它會掛起。FTPSClient retrievefile()掛

出於某種原因,非常小的文件做傳輸(最多5792個字節),但什麼都給出了以下PrintCommandListener輸出:

運行:
220 ----------歡迎來到Pure-FTPd [privsep] [TLS] ----------
220-您是允許的50個用戶中的第2個。
220-當地時間現在是19:42。服務器端口:21.
220 - 這是一個私人系統 - 沒有匿名登錄
220-IPv6連接也歡迎在此服務器上。
220 15分鐘不活動後將斷開連接。
AUTH TLS
234 AUTH TLS OK。
用戶
331用戶確定。需要密碼
PASS
230行。目前的限制類目錄是/
TYPE現在一個
200型是ASCII
EPSV
229擴展被動模式OK(||| 53360 |)
RETR test.txt的
150接受的數據連接
150 7.3 KB的下載

下面是代碼:

try { 

    FTPSClient ftpClient = new FTPSClient("tls",false); 

    ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); 

    ftpClient.connect(host, port); 

    int reply = ftpClient.getReplyCode(); 

    if (FTPReply.isPositiveCompletion(reply)) { 
     ftpClient.enterLocalPassiveMode(); 
     ftpClient.login(username, password); 
     ftpClient.enterLocalPassiveMode(); 
     FileOutputStream outputStream = new FileOutputStream(tempfile); 
     ftpClient.setFileType(FTPClient.ASCII_FILE_TYPE); 
     ftpClient.retrieveFile("test.txt", outputStream); 
     outputStream.close(); 
     ftpClient.logout(); 
     ftpClient.disconnect(); 
    } 
} catch (IOException ioe) { 
    System.out.println("FTP client received network error"); 
} 

任何想法,不勝感激。

+0

請正確格式化您的代碼。您可以使用編輯器頂部提供的工具將其標記並指向並單擊格式。 –

回答

0

典型地,對於FTPS連接FTP命令序列推移(每RFC 4217AUTH TLS,​​,然後USERPASS。因此,你可以嘗試:

FTPSClient ftpClient = new FTPSClient("tls",false); 
ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); 
ftpClient.connect(host, port); 
int reply = ftpClient.getReplyCode(); 
if (FTPReply.isPositiveCompletion(reply)) { 
    ftpClient.execPBSZ(0); 
    reply = ftpClient.getReplyCode(); 
    // Check for PBSZ error responses... 
    ftpClient.execPROT("P"); 
    reply = ftpClient.getReplyCode(); 
    // Check for PROT error responses... 

    ftpClient.enterLocalPassiveMode(); 

顯式告訴服務器緩存數據連接(​​),並使用TLS來保護數據傳輸(PROT P)。

能夠傳遞一些字節的事實表明,這個問題是不是併發症通常與防火牆/路由器/ NAT,這是另一種常見FTPS問題。

希望這會有所幫助!

+0

謝謝,這很有用,因爲我有一半希望它是防火牆的東西。但是,該代碼不起作用,防止掛起,但輸出「FTP客戶端收到網絡錯誤」。 –

+0

嗯。我想知道'FTPSClient'是否不期望受保護的數據傳輸。如果你使用'execPROT(「C」)'會發生什麼?這告訴服務器清除保護的數據傳輸通道(僅用於測試)。 – Castaglia

+0

您也可以使用'lftp'(或其他FTPS客戶端)下載文件來仔細檢查服務器(以及任何防火牆/ NAT /路由器)是否正常工作。如果_that_成功,那麼你知道這是找到正確的代碼的問題;如果不是,那麼問題可能不在您的代碼中,但在其他地方。 – Castaglia