FTP Java org.apache.commons.net.MalformedServerReplyException: усеченный ответ сервера: '220 '

Я использую библиотеку Java Apache Commons Net для загрузки файлов с FTP-сервера. В качестве отправной точки я пытаюсь повторно использовать код из https://www.codejava.net/java-se/networking/ftp/java-ftp-file-upload-tutorial-and-example. В целом, код выполняется без проблем / исключений, однако для одного конкретного FTP-сервера ( ftp://ftp.nasdaqtrader.com/symboldirectory/nasdaqlisted.txt) я получаю следующую ошибку:

org.apache.commons.net.MalformedServerReplyException: усеченный ответ сервера: '220 '

Мой код выглядит следующим образом:

String server = "ftp.nasdaqtrader.com";
int port = 21;
String user = "anonymous";
String pass = "pw";

FTPClient ftpClient = new FTPClient();
try {

    ftpClient.connect(server, port);
    ftpClient.login(user, pass);
    ftpClient.enterLocalPassiveMode();
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

    // APPROACH #1: using retrieveFile(String, OutputStream)
    String remoteFile1 = "/symboldirectory/nasdaqlisted.txt";
    File downloadFile1 = new File("C:\\filedirectory\\nasdaqlisted.txt");
    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.");
    }

    } catch (IOException ex) {
    System.out.println("Error: " + ex.getMessage());
    ex.printStackTrace();
} finally {
    try {
        if (ftpClient.isConnected()) {
            ftpClient.logout();
            ftpClient.disconnect();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

Подключение из моего терминала Windows дает следующее:

C:\Computer>ftp ftp.nasdaqtrader.com
Connected to ftp.nasdaqtrader.com.
220
200 OPTS UTF8 command successful - UTF8 encoding now ON.
User (ftp.nasdaqtrader.com:(none)): anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password:
230 User logged in.
ftp> quit
221 Goodbye.

Для аналогичного FTP-сервера (погода NOAA), где код подключается и загружается без исключений при подключении через терминал Windows, выдает следующее:

C:\Computer>ftp ftp.cdc.noaa.gov
Connected to ftp.cdc.noaa.gov.
220-**********************************************************************
220-**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**    *
220-*                                                                    *
220-* This is a Department of Commerce (DOC) computer system.  DOC       *   
220-* computer systems are provided for the processing of official U.S.  *
220-* Government information only. Unauthorized access or use of this    *
220-* computer system may subject violators to criminal, civil, and/or   *
220-* administrative action. All data contained within DOC computer      *
220-* systems is owned by the DOC, and may be audited, intercepted,      *
220-* recorded, read, copied, or captured in any manner and disclosed in *
220-* any manner, by authorized personnel. THERE IS NO RIGHT OF PRIVACY  *
220-* IN THIS SYSTEM. System personnel may disclose any potential        *
220-* evidence of crime found on DOC computer systems to appropriate     *
220-* authorities. USE OF THIS SYSTEM BY ANY USER, AUTHORIZED OR         *
220-* UNAUTHORIZED CONSTITUTES CONSENT TO THIS AUDITING, INTERCEPTION,   *
220-* RECORDING, READING, COPYING, CAPTURING, and DISCLOSURE OF COMPUTER *
220-* ACTIVITY.                                                          *
220-*                                                                    *
220-**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**    *
220-**********************************************************************
220
200 Always in UTF8 mode.
User (ftp.cdc.noaa.gov:(none)): anonymous
331 Please specify the password.
Password:
230 Login successful.

Таким образом, сравнивая два ответа, выясняется, что ftp.nasdaqtrader.com просто не предоставляет соответствующий (стандартный?) Ответ 220 (то есть усеченный). Так:

  1. правильно ли я определил проблему и
  2. Как правильно решить эту проблему?

Спасибо!

1 ответ

Решение

Библиотека Apache Commons Net считает, что 220 ответ от сервера не соответствует RFC 959 (вероятно, по праву).

Если вы хотите разрешить библиотеке общаться с сервером, позвоните FTP.setStrictReplyParsing:

ftpClient.setStrictReplyParsing(false);
Другие вопросы по тегам