FTP ответ 421 получен. Сервер закрыл соединение

Я пишу код JAVA для обхода FTP-местоположения с помощью Apache Commons Net FTPClient и получаю вывод в файле Excel. код выполняется правильно в течение примерно 5 минут, но затем выдает IOException:

org.apache.commons.net.ftp.FTPConnectionClosedException: FTP response 421 received.  Server closed connection.

Я использую commons-net-3.0.1.jar. Я сделал несколько исследований и разработок:

setDefaultTimeout(6000); 
setConnectTimeout(3000);
setSoTimeout(3000);
enterLocalPassiveMode();

и отправка NOOP, но все равно получаю ту же ошибку.

Все, что я пытаюсь сделать, это пройти через каталог и, если файл найден, получить имя файла и дату обновления файла в Excel, а если каталог найден, войти внутрь и делать, пока файл не будет найден снова.

Пожалуйста, помогите и спросите, нужна ли какая-либо другая информация. Я новичок в JAVA.

3 ответа

Решение

Смотрите здесь: http://kb.globalscape.com/KnowledgebaseArticle10142.aspx

    Ошибка 421 Сервис недоступен, закрытие контрольного соединения. 
    Ошибка 421 Достигнут предел пользователя 
    Ошибка 421 Вы не авторизованы для подключения 
    Ошибка 421 Максимальное количество подключений достигнуто 
    Ошибка 421 Превышено максимальное количество подключений 

Возможно, вы не повторно используете соединение, а используете новое соединение для каждого запроса, заполняя сервер соединениями, пока он не достигнет предела соединения. Попробуйте закрыть ваши соединения или возобновить их.

Для дальнейшего использования..

Если решение @fiffy не сработало, возможно, попробуйте включить TLS (FTPS/Secure Connection), Мой сервер был настроен на прием только протокола FTPS, поэтому он отклонял мое незашифрованное соединение, поэтому включил TLS (FTPS) помог мне решить проблему.

Примечание:- эта ошибка FTP response 421 received очень известен в Netbeans, так как он также построен в Java.

Обычно это происходит, когда сервер принимает соединение ftps (не соединение ftp). сеть apache commons также поддерживает FTPS. используйте приведенный ниже код для справки.

1) шифрование сервера FTPS будет либо TLS шифрования явного или TLS шифрования явного .use конструктора арга для FTPS соответственно. нравиться

            FTPSClient ftpClient = new FTPSClient(false);

2) если срок действия сертификата безопасности вашего FTPS-сервера истек, отключите проверку от клиента с помощью

      ftpClient.setTrustManager(new X509TrustManager() {
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    @Override
    public void checkClientTrusted(X509Certificate[] certs, String authType) {
    }

    @Override
    public void checkServerTrusted(X509Certificate[] certs, String authType) {
    }
});

3) включите передачу файлов между сервером и клиентом, используя этот метод

          ftpClient.enterLocalPassiveMode();

4) используйте правильный номер порта. Обычно для явного шифрования это 21, а для неявного - 990.

Вышеупомянутые четыре являются общими конфигурациями, необходимыми для установления соединения. Конечный фрагмент выглядит примерно так

      FTPSClient ftpClient = new FTPSClient(false);
        ftpClient.setTrustManager(new X509TrustManager() {
            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            @Override
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        });
        ftpClient.connect("ftps.mydomain.com",21);
        boolean res = ftpClient.login("username", "password");
        if(!res) throw new Exception("unable to connect to ftps");
        int reply=ftpClient.getReplyCode();
        if(FTPReply.isPositiveCompletion(reply)){
            ftpClient.enterLocalPassiveMode();
            FTPFile[] ftpFiles = ftpClient.listFiles("/folder/subfolder");
            System.out.println("complete "+reply+" "+ftpFiles.length);
            for(FTPFile x: ftpFiles){
                System.out.println(x.getName());
            }
            ftpClient.retrieveFile("/folder/subfolder/file.tsv",new FileOutputStream(new File("C:\\Users\\myname\\Desktop\\out.csv")));
        }else{
            throw new RuntimeException("unable to get valid reply from ftp server. Reply code is "+reply);
        }
Другие вопросы по тегам