Правильно проверьте подключение к FTP-серверу

Я открываю соединение с FTP-сервером в начале своей программы.

Прежде чем выполнять операции на сервере, я хочу проверить, успешно ли установлено соединение. Самый простой быстрый способ, поэтому, если соединение пропало, я попытаюсь подключиться снова.

Я использовал этот код, чтобы сделать это:

private boolean checkConnection()
{
    try 
    {
        boolean success = ftpClient.login(user_name, password);
        if(success)
            return true;
        else 
            return false;
    }
}

Но этот метод генерирует исключение NullPointer, когда соединение было закрыто.

Я могу проверить соединение с ftpClient.connect(server, port);, но это все равно, что пытаться снова подключиться.

Как лучше проверить соединение?


person Michael A    schedule 12.12.2012    source источник
comment
вы пытались изменить свой код?   -  person Mohammod Hossain    schedule 12.12.2012
comment
@Mohammod Hossain, ваш код хорош, но мне было интересно, есть ли лучший способ проверить соединение, не пытаясь подключиться   -  person Michael A    schedule 12.12.2012
comment
Я думаю, что вы используете библиотеку org.apache.commons.net.ftp, поэтому API имеет такую ​​реализацию для подключения к ftp-серверу.   -  person Mohammod Hossain    schedule 12.12.2012
comment
Вы получили ответ, который хотели?   -  person Mohammod Hossain    schedule 12.12.2012
comment
@Mohammod Hossain Спасибо, я пробую другой подход   -  person Michael A    schedule 12.12.2012


Ответы (1)


Попытка отправить простой sendNoOp() и проверка ответа может быть хорошим способом легкой проверки соединения:

private boolean checkConnectionWithOneRetry()
{
    try 
    {
        // Sends a NOOP command to the FTP server. 
        boolean answer = ftpClient.sendNoOp();
        if(answer)
            return true;
        else
        {
            System.out.println("Server connection failed!");
            boolean success = reconnect();
            if(success)
            {
                System.out.println("Reconnect attampt have succeeded!");
                return true;
            }
            else
            {
                System.out.println("Reconnect attampt failed!");
                return false;
            }
        }
    }
    catch (FTPConnectionClosedException e) 
    {
        System.out.println("Server connection is closed!");
        boolean recon = reconnect();
        if(recon)
        {
            System.out.println("Reconnect attampt have succeeded!");
            return true;
        }
        else
        {
            System.out.println("Reconnect attampt have failed!");
            return false;
        }

    }
    catch (IOException e) 
    {
        System.out.println("Server connection failed!");
        boolean recon = reconnect();
        if(recon)
        {
            System.out.println("Reconnect attampt have succeeded!");
            return true;
        }
        else
        {
            System.out.println("Reconnect attampt have failed!");
            return false;
        }   
    }
    catch (NullPointerException e) 
    {
        System.out.println("Server connection is closed!");
        boolean recon = reconnect();
        if(recon)
        {
            System.out.println("Reconnect attampt have succeeded!");
            return true;
        }
        else
        {
            System.out.println("Reconnect attampt have failed!");
            return false;
        }   
    }
}
person Michael A    schedule 12.12.2012
comment
Похоже, вы используете org.apache.commons.net.ftp. В этом случае вы можете использовать методы isAvailable() или isConnected(), они работают быстрее, чем ftpClient.sendNoOp(). Недостатком является то, что оба метода по-прежнему не гарантируют, что подключение работает. commons.apache. org/proper/commons-net/apidocs/org/apache/ - person David Abragimov; 31.07.2019