Проверка наличия сервера в Java-коде - программирование
Подтвердить что ты не робот

Проверка наличия сервера в Java-коде

Я хочу проверить, доступно ли серверное приложение. После запуска сервера я хочу остановить проверку до тех пор, пока сервер не изменит статус. Как это сделать с моим кодом:

 private static final String SERVER_ADDRESS = "192.144.10.10";
    private static final int TCP_SERVER_PORT = 8890;
    private static boolean connected = false;
    static Socket s;

    public static void main(String[] args) {

    Timer timer = new Timer();
    timer.schedule(task, 01, 5001); }  

static TimerTask task = new TimerTask() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            if (connected == false)
            {
            System.out.println(hostAvailabilityCheck());
            }
        }
    };

    public static boolean hostAvailabilityCheck()
    { 

        boolean available = true; 
        try {               
            if (connected == false)
            { (s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)).close();    
            }               
            } 
        catch (UnknownHostException e) 
            { // unknown host 
            available = false;
            s = null;
            } 
        catch (IOException e) { // io exception, service probably not running 
            available = false;
            s = null;
            } 
        catch (NullPointerException e) {
            available = false;
            s=null;
        }


        return available;   
    } 

Есть ли лучший способ решить эту проблему?

4b9b3361

Ответ 1

Метод проверки можно переписать следующим образом (Java 7 и более поздние версии):

public static boolean hostAvailabilityCheck() { 
    try (Socket s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)) {
        return true;
    } catch (IOException ex) {
        /* ignore */
    }
    return false;
}

В дополнение к упрощению обработки исключений это устраняет утомляющую утечку Socket. (Если вы заинтересованы в времени, затраченном на выполнение этой проверки, установите время ожидания подключения перед попыткой подключения: см. Установка таймаута для операций сокета)

Но проблемы с этим подходом многократно:

  • Он только проверяет, что что-то слушает подключения. Если ваша служба находится за прокси... или управляется чем-то вроде службы inetd... тогда принятые подключения не означают, что ваша служба действительно работает.

  • Это приведет к тому, что ваша служба "увидит" подключения, которые закрываются без отправки запроса. Таким образом, вам лучше закодировать свой сервис, чтобы справиться с этим "изящно".

  • Выполнение этого многократно добавляет нагрузку на сеть и сервер.

  • Если вы установите короткий тайм-аут, потому что вы не хотите, чтобы тест "зависал", тогда вы рискуете слишком коротко установить его и судить о том, что хост не работает, если это не так.


После запуска сервера я хочу остановить проверку до тех пор, пока сервер не изменит статус

Это почти невозможно. Причина в том, что вы не сможете определить, не изменил ли сервер статус "без изменений". Или, по крайней мере, вы не сможете это сделать, не выполняя сложную службу уведомления о статусе, когда сервер вызывает клиента, чтобы сообщить, что он меняет статус. (И если "статус изменения" включает "смерть" или "потерянное сетевое подключение", то вы не сможете сделать это уведомление надежным... если вообще.)

Ответ 2

Сначала проверьте, работает ли сервер, и сервер принимает соединение.

   public static boolean hostAvailabilityCheck()
{ 
    s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT);
    boolean available = true; 
    try {               
        if (s.isConnected())
        { s.close();    
        }               
        } 
    catch (UnknownHostException e) 
        { // unknown host 
        available = false;
        s = null;
        } 
    catch (IOException e) { // io exception, service probably not running 
        available = false;
        s = null;
        } 
    catch (NullPointerException e) {
        available = false;
        s=null;
    }


    return available;   
} 

Ответ 3

public static boolean hostAvailabilityCheck() { 
    try (Socket s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)) {
        return true;
    } catch (IOException ex) {
        /* ignore */
    }
    return false;
}

работает, но проблема в том, что когда вы включаете телефон через WI-FI, он приходит к "завивающейся остановке" и никаких действий. для мысли... =)

следующий код будет работать через WI-FI... если вы увеличите время соединения -

public static boolean isOnline() {
    boolean b = true;
    try{
        InetSocketAddress sa = new InetSocketAddress("SERVER_IP_ADDRESS", PORT);
        Socket ss = new Socket();
        ss.connect(sa, 1);            --> change from 1 to 500 (for example)
        ss.close();
    }catch(Exception e) {
        b = false;
    }
    return b;
}

Ответ 4

Я использовал этот метод для своего ServerUtil.

    public static boolean isOnline() {
    boolean b = true;
    try{
        InetSocketAddress sa = new InetSocketAddress("SERVER_IP_ADDRESS", PORT);
        Socket ss = new Socket();
        ss.connect(sa, 1);
        ss.close();
    }catch(Exception e) {
        b = false;
    }
    return b;
}