2011-04-28 124 views
4

我想通過我的java代碼連接到客戶端ftps服務器。我使用Apache公共庫來做到這一點。但是,我無法這樣做。任何人都可以幫助我這個。通過java連接到ftps站點

客戶端服務器使用FTPS /隱式SSL連接,並將數據連接使用Passive模式。

我的代碼如下:

public static void connectServer(String host, int port, String userName, String password) throws Exception { 
    FTPSClient client = new FTPSClient("SSL", true); 
    String remote = "Contact.xml"; 

    File inFile = new File("C:/Documents/Applications/Contact.xml"); 
    File outFile = new File("C:/Documents/Applications/Sample.xml"); 

    InputStream input = new FileInputStream(inFile); 
    InputStream out = new FileInputStream(outFile); 

    try { 

     if(client.isConnected()){ 
      client.disconnect(); 
     } 

     client.connect(host,990); 
     client.enterLocalPassiveMode(); 
     client.enterRemotePassiveMode(); 

     client.login(userName, password); 

     client.setBufferSize((int)inFile.length()+100); 
     client.completePendingCommand(); 

     System.out.println(client.printWorkingDirectory()); 
     System.out.println(inFile.getAbsolutePath()); 

     client.storeFile(remote, input); 
     out = client.retrieveFileStream("/folder/inputfeed.xml"); 

     client.completePendingCommand(); 
     client.logout(); 

    } catch (Exception e) { 
    e.printStackTrace(); 
     System.err.println(client.getReplyString()); 

    } finally { 
     out.close(); 
     input.close(); 
     client.disconnect(); 
    } 
} 

此代碼不拋出任何異常,但我沒有看到文件被複制到服務器,無論任何數據被複制到我的InputStream。另外,用於獲取工作目錄的sysout語句會返回正確的目錄。我也可以通過Filezilla和WinSCP連接到服務器。

請幫助,我陷入了這一點。

感謝

回答

0

你爲什麼要進入被動模式登陸()之前?

我懷疑這可能是問題,因爲症狀是活動模式,由於固定規則DROP無法建立連接(不是REJECT;當被拒絕時立即拋出異常,但DROP可以永久掛起)。

P.S.此外,不清楚什麼是「遠程」被動模式;唯一有所作爲的是「本地」。

+0

非常感謝您的答覆......我這個一個newbee。我確實改變了我的代碼,以便在登錄後移動被動模式並移除遠程被動模式,但結果沒有變化。我的文件仍然沒有被傳送,並且在檢索遠程文件時我沒有看到任何東西 – Vivek 2011-04-28 21:59:14

+0

@Vivek你是如何解決它的? – 2016-12-12 07:26:20

0

enterRemotePassiveMode();僅用於服務器到服務器的連接,而不是客戶端到服務器。刪除該行。

0

client.connect(host,990);爲什麼使用硬編碼的端口號?我建議你改變這一行使用的端口號傳遞給你函數/方法

對於我的服務器斷開連接之前沒有時間看你的代碼掛起,這條線

client.completePendingCommand(); 

原因。我不確定你是否沒有得到例外,或者你沒有足夠長的時間來等待你的代碼拋出異常

0

你需要檢查每個client(socket)方法後的狀態。 特別是在client.connect()client.login()之後。

例子:

client.connect(host, 990); 
System.out.print(client.getReplyString()); 
... 
client.login(username,password); 
System.out.print(client.getReplyString()); 

如果方法失敗(錯誤),getReplyString()通常是你做了什麼錯得很描述。

0

您使用FTP的端口號 - 21 對SFTP是22

我有一些什麼同樣的要求,從不同的服務器下載文件,所以有時我不得不使用21和一些時間22。

我嘗試以下方法

FTPClient ftpClient = new FTPClient(); 

     int port = 21; 
     try { 

      try{ 
       ftpClient.connect(serverName, port); 
      }catch(Exception e){ 
       ftpClient.connect(serverName, 22); 
      } 

       try { 
      ftpClient.login(user, pass); 
      ftpClient.enterLocalPassiveMode(); 
      ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 
      ftpClient.changeWorkingDirectory(workingDir); 


      String fileName = "fileToDownLoad"; 

      File downloadFile = new File(fileName); 

      OutputStream localOutputStream = new BufferedOutputStream(
        new FileOutputStream(downloadFile)); 
      InputStream fptInputStream = ftpClient.retrieveFileStream(folder 
        + "/" + file); 
      byte[] bytesArray = new byte[4096]; 
      int bytesRead = -1; 
      while ((bytesRead = fptInputStream.read(bytesArray)) != -1) { 
       localOutputStream.write(bytesArray, 0, bytesRead); 
      } 

      boolean success = ftpClient.completePendingCommand(); 
      if (success) { 

      } 
      localOutputStream.close(); 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 

    }