JAVA Указание порта с помощью InetAddress

Я использую InetAddress, чтобы определить, подключен ли мой сервер.

Если сервер отключен, он перезапустит сервер.

Этот процесс повторяется каждые 5 минут, чтобы еще раз проверить, подключен ли сервер.

Он работает нормально, но теперь мне нужно выяснить, как указать, что я хочу использовать порт 43594 при проверке состояния сервера вместо порта по умолчанию 80.

Спасибо! Вот мой код:

import java.net.InetAddress;
public class Test extends Thread {
    public static void main(String args[]) {
        try {
            while (true) {
                try
                {
                    InetAddress address = InetAddress.getByName("cloudnine1999.no-ip.org");
                    boolean reachable = address.isReachable(10000);
                    if(reachable){
                        System.out.println("Online");
                    }
                    else{
                        System.out.println("Offline: Restarting Server...");
                        Runtime.getRuntime().exec("cmd /c start start.bat");
                    }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                Thread.sleep(5 * 60 * 1000);
            }
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

РЕДАКТИРОВАТЬ:

Хорошо, я последовал чьему-то совету и добился этого. Но теперь, когда я раскомментирую эту строку .. Runtime.getRuntime().exec("cmd /c start start.bat");

Я получаю эту ошибку ..

error: unreported exception IOException; must be caught or declared to be thrown

Это мой текущий код:

import java.net.*;
import java.io.*;
public class Test extends Thread {
    public static void main(String args[]) {
        try {
            while (true) {
                SocketAddress sockaddr = new InetSocketAddress("cloudnine1999.no-ip.org", 43594);
                Socket socket = new Socket();
                boolean online = true;
                try {
                    socket.connect(sockaddr, 10000);
                }
                catch (IOException IOException) {
                    online = false;
        }
                if(!online){
            System.out.println("OFFLINE: Restarting Server..");
            //Runtime.getRuntime().exec("cmd /c start start.bat");
        }
                if(online){
                    System.out.println("ONLINE");
                }
                Thread.sleep(1 * 10000);
            }
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

person Cloudnine1999    schedule 16.02.2013    source источник
comment
Вы пытались изменить параметр хоста, чтобы включить порт? cloudnine1999.no-ip.org:43594   -  person FThompson    schedule 16.02.2013
comment
Javadoc говорит: A typical implementation will use ICMP ECHO REQUESTs if the privilege can be obtained, otherwise it will try to establish a TCP connection on port 7 (Echo) of the destination host. - вы уверены, что используемая вами реализация действительно использует тестовое соединение на 80-м порту?   -  person fvu    schedule 16.02.2013
comment
@Vulcan Спасибо, но я попробовал.   -  person Cloudnine1999    schedule 16.02.2013
comment
@fvu Я на самом деле пытаюсь протестировать порт 43594, а не 80, я думал, что это тестирует порт 80, я не понимал, что по умолчанию он тестирует порт 7. Но это всего лишь детали, мне нужно изменить его с любого порта. проверяет, на порт 43594.   -  person Cloudnine1999    schedule 16.02.2013


Ответы (1)


Как я уже упоминал в комментариях, согласно Javadoc isReachable не реализован таким образом, чтобы вы могли управлять выбранным портом. Фактически, если это разрешено системными привилегиями, он просто пингует машину (запрос ICMP).

Выполнение этого вручную (то есть с использованием сокета), безусловно, сработает и на самом деле не сложнее и / или дольше:

SocketAddress sockaddr = new InetSocketAddress("cloudnine1999.no-ip.org", 43594);
// Create your socket
Socket socket = new Socket();
boolean online = true;
// Connect with 10 s timeout
try {
    socket.connect(sockaddr, 10000);
} catch (SocketTimeoutException stex) {
    // treating timeout errors separately from other io exceptions
    // may make sense
    online=false;
} catch (IOException iOException) {
    online = false;    
} finally {
    // As the close() operation can also throw an IOException
    // it must caught here
    try {
        socket.close();
    } catch (IOException ex) {
        // feel free to do something moderately useful here, eg log the event
    }

}
// Now, in your initial version all kinds of exceptions were swallowed by
// that "catch (Exception e)".  You also need to handle the IOException
// exec() could throw:
if(!online){
    System.out.println("OFFLINE: Restarting Server..");
    try {
        Runtime.getRuntime().exec("cmd /c start start.bat");
    } catch (IOException ex) {
         System.out.println("Restarting Server FAILED due to an exception " + ex.getMessage());
    }
}        

РЕДАКТИРОВАТЬ: забыл обработать IOException, что также означает, что сервер не работает, добавлено

EDIT2: добавлена ​​обработка исключения IOException, которое может вызвать close ()

EDIT3: и обработка исключений для exec ()

person fvu    schedule 16.02.2013
comment
О, также пришлось удалить socket.close (), это также дало мне ошибки. - person Cloudnine1999; 16.02.2013
comment
Нет, не удаляйте его, я изменил свой код, чтобы показать, как его отловить локально. Исключения IMO для операций close () - не самая полезная функция в Java, но так оно и есть. Извините за путаницу, небольшая тестовая программа, которую я использую для тестирования таких фрагментов, уже имела throws IOException, из-за чего я пропустил эту проблему. - person fvu; 16.02.2013
comment
И добавлен пример того, как поймать и обработать исключение, вызванное exec - я думаю, что программа почти завершена, вам не кажется? :-) - person fvu; 16.02.2013
comment
почти ... Недостижимый блок перехвата для SocketTimeoutException. Это уже обрабатывается блоком catch для IOException :-) - person harschware; 18.02.2015
comment
@harschware действительно, приятный улов - исправлен код. - person fvu; 19.02.2015