2016-01-28 14 views
0

Установлен сервер filezilla и включен параметр FTP через TLS в настройках и запущен сервер. Через eclipse java client я попытался подключиться к серверу для загрузки и скачивания файла, используя приведенный ниже код , используя общедоступную библиотеку apache.FTPSClient загрузка и загрузка файлов всегда размер 0 и исключение

 FTPSClient ftpClient = new FTPSClient(false);  
     // Connect to host 
     ftpClient.connect(mServer, mPort); 
     int reply = ftpClient.getReplyCode(); 
     System.out.println("The reply code is "+reply); 
     if (FTPReply.isPositiveCompletion(reply)) { 

     // Login 
     if (ftpClient.login("******", "*******")) { 
      // Set protection buffer size 
      ftpClient.execPBSZ(0); 
      // Set data channel protection to private 
      ftpClient.execPROT("P"); 
      // Enter local passive mode 
      ftpClient.enterLocalPassiveMode(); 


      // Upload File using storeFile 
      File firstLocalFile = new File("e:/Test.txt"); 
      String firstRemoteFile = "hello.txt"; 
      InputStream is = new FileInputStream(firstLocalFile); 
      String result = getStringFromInputStream(is); 
      System.out.println(result); 

      Object output = ftpClient.storeFile(firstRemoteFile, is); 
      System.out.println(output); 
      is.close(); 

      // Download File using retrieveFile(String, OutputStream) 
      String remoteFile1 = "/settings.xml"; 
      File downloadFile1 = new File("e:/testOutput.xml"); 
      OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1)); 
      boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1); 
      outputStream1.close(); 

      if (success) { 
       System.out.println("File #1 has been downloaded successfully."); 
      } 




     // Logout 
     ftpClient.logout(); 

    // Disconnect 
     ftpClient.disconnect(); 

     } else { 
      System.out.println("FTP login failed"); 
     } 

     // Disconnect 
     ftpClient.disconnect(); 

     } else { 
     System.out.println("FTP connect to host failed"); 
     } 
    } catch (IOException ioe) { 
     System.out.println("FTP client received network error"); 
     ioe.printStackTrace(); 
    } catch (Exception nsae) { 
     System.out.println("FTP client could not use SSL algorithm"); 
     nsae.printStackTrace(); 
    } 

Это создает файл hello.txt на сервере, но размер имеет 0KB (размер исходного файла 10 кб) и в конечном итоге следующее сообщение об ошибке. Пожалуйста, помогите мне решить эту проблему

 javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source) 
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) 
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
at org.apache.commons.net.ftp.FTPSClient._openDataConnection_(FTPSClient.java:619) 
at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:633) 
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:624) 
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1976) 
at com.test.ftps.TestClass.main(TestClass.java:88) 
    Caused by: java.io.EOFException: SSL peer shut down incorrectly 
at sun.security.ssl.InputRecord.read(Unknown Source) 
... 9 more 

ответ

1

просто снимите галочку «Требуется TLC сеанса возобновления на подключение данных ...» на сервере FileZilla -> Настройки -> FTP через TLS Настройки -> снимите флажок Требовать Повторное возобновление сеанса ТСХ при подключении к данным при использовании PROT P

0

В дополнение к ответу пользователя2750213 (3) Filezilla остерегайтесь включения необходимых протоколов. Вы можете проверить их запуск this code или this other на jvm, подключающемся к серверу FTPS. В последних версиях сервера Filezilla используется TLSv1.2.

Если это сработает для вас, вы можете получить java.net.SocketException: Не подключенные сокеты не реализованы. В этом случае вам нужно написать свой собственный класс, который расширяет класс DefaultSocketFactory, а затем назначит его клиенту FTPS методом ftpsClient.setSocketFactory (yourSocketFactory), переопределяющим метод createSocket(), который должен возвращать новый Socket()