ftp4j «FTP-соединение закрыто» при попытке загрузить файл - PullRequest
0 голосов
/ 31 марта 2020

Я использую ftp4j для отправки данных на сервер через FTP (точнее, FTPS). Я могу подключиться и аутентифицировать пользователя, но когда я пытаюсь загрузить файл, возникает сообщение IOException, содержащее следующее сообщение: «FTP-соединение закрыто», даже если соединение все еще активно.

Я перепробовал несколько незащищенных FTP-сайтов, и все отлично работает, включая загрузку. Я не смог найти ни одного сайта FTPS, с помощью которого я мог бы проверить загрузку, поэтому единственная ссылка, которую я имею, - это сервер FTPS, с которого я работаю (FTP через явный TSL / SSL). Итак, если у кого-то из вас есть сайт c FTPS, где я могу загружать файлы, дайте мне знать!

Я также попытался поиграть с кодировкой. И UTF-8, и ASCII вообще ничего не изменили.

Да, я настраиваю защиту / шифрование на основе FTP-сайта, на который я хочу загрузить.

РЕДАКТИРОВАТЬ: Если Я удаляю ftpClient.upload(task.getFile());, все работает нормально.

Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь. Спасибо за вашу доброту!

Вот мой код:

if (this.app == null) {
    return;
}

if (this.tasks == null) {
    return;
}

synchronized (ftpClient) {
    try {
        if (!ftpClient.isConnected()) {
            ftpClient.connect(ftpHandler.getHost(), ftpHandler.getPort());
        }

        if (!ftpClient.isAuthenticated()) {
            ftpClient.login(ftpHandler.getUser(), ftpHandler.getPassword());
        }

        for (FTPTransferTask task : tasks) {
            if (task.getFile() == null) {
                continue;
            }

            if (!task.getFile().exists()) {
                continue;
            }

            try {
                if (ftpClient.currentDirectory() != ftpHandler.getPath()) {
                    ftpClient.changeDirectory(ftpHandler.getPath());
                }

                Log.w("myApp", "FTPTransferThread.java - run - Sending file " + task.getFile().getName() + " to " + ftpClient.getHost());
                ftpClient.upload(task.getFile()); // This is where the exception is raised

                Log.w("myApp", "FTPTransferThread.java - run - File " + task.getFile().getName() + " sent to " + ftpClient.getHost());
            } catch (Exception e) {
                // Here, the connection is still open (and the user is still authenticated)
                // At least, based on the FTPClient class's properties
                Log.w("myApp", "FTPTransferThread.java - run - Failed to send file " + task.getFile().getName() + " to " + ftpClient.getHost());
                e.printStackTrace();
            }
        }

        if (ftpClient.isConnected()) {
            ftpClient.disconnect(true); // The exception is raised here too
        }
    } catch (Exception e) {
        Log.w("myApp", "FTPTransferThread.java - run - Failed to communicate with the client.");
        e.printStackTrace();

        try {
            if (ftpClient.isConnected()) {
                ftpClient.disconnect(false); // Using false, so I'm not notifying the server, so no problem
            }
        } catch (Exception ex) {
            e.printStackTrace();
        }
    }
}

Вот трассировка стека:

W/System.err: java.io.IOException: FTPConnection closed
        at it.sauronsoftware.ftp4j.FTPCommunicationChannel.read(FTPCommunicationChannel.java:144)
        at it.sauronsoftware.ftp4j.FTPCommunicationChannel.readFTPReply(FTPCommunicationChannel.java:187)
W/System.err:     at it.sauronsoftware.ftp4j.FTPClient.currentDirectory(FTPClient.java:1590)
        at eu.basicairdata.graziano.gpslogger.ftp.FTPTransferThread.run(FTPTransferThread.java:58)
W/myApp: FTPTransferThread.java - run - Failed to communicate with the client.
W/System.err: java.io.IOException: FTPConnection closed
        at it.sauronsoftware.ftp4j.FTPCommunicationChannel.read(FTPCommunicationChannel.java:144)
W/System.err:     at it.sauronsoftware.ftp4j.FTPCommunicationChannel.readFTPReply(FTPCommunicationChannel.java:187)
        at it.sauronsoftware.ftp4j.FTPClient.disconnect(FTPClient.java:1133)
        at eu.basicairdata.graziano.gpslogger.ftp.FTPHandler.ClientDisconnect(FTPHandler.java:149)
        at eu.basicairdata.graziano.gpslogger.ftp.FTPTransferThread.run(FTPTransferThread.java:77)
...