2013-02-16 8 views
6

Używam InetAddress do sprawdzenia, czy mój serwer jest podłączony do sieci.JAVA Określanie portu za pomocą InetAddress

Jeśli serwer jest w trybie offline, zrestartuje serwer.

Ten proces jest przeprowadzany co 5 minut, aby sprawdzić ponownie, czy serwer jest podłączony do sieci.

To działa dobrze, ale teraz muszę dowiedzieć się, jak określić, że chcę użyć portu 43594 podczas sprawdzania stanu serwera zamiast portu domyślnego 80.

dzięki! Oto mój kod:

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(); 
     } 
    } 
} 

EDIT:

Dobrze więc wziąłem czyjąś radą i zrobiłem go do tego. Ale teraz, kiedy odkomentowaniu tej linii .. Runtime.getRuntime().exec("cmd /c start start.bat");

otrzymuję ten błąd ..

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

To jest mój bieżący kod:

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(); 
     } 
    } 
} 
+0

Czy próbowałeś zmodyfikować parametr hosta tak, aby zawierał port? 'cloudnine1999.no-ip.org: 43594' – Vulcan

+0

[Javadoc] (http://docs.oracle.com/javase/6/docs/api/java/net/InetAddress.html#isReachable%28int%29) mówi : 'Typowa implementacja użyje ŻĄDANIA ECHO ICMP, jeśli można uzyskać przywilej, w przeciwnym razie spróbuje ustanowić połączenie TCP na porcie 7 (Echo) hosta docelowego. '- czy jesteś pewien, że implementacja, której używasz, używa połączenia testowego na porcie 80? – fvu

+0

@Vulcan Dzięki, ale spróbowałem. – Cloudnine1999

Odpowiedz

7

Jak już wspomniano w komentarzach , zgodnie z Javadoc isReachable nie jest zaimplementowany w sposób, który pozwoli Ci kontrolować wybrany port. W rzeczywistości, jeśli jest to dozwolone przez uprawnienia systemowe, po prostu pinguje maszynę (żądanie ICMP).

Robi to ręcznie (czyli przy użyciu gniazda) na pewno działa i nie jest to bardziej skomplikowane i/lub dłużej:

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()); 
    } 
}   

EDIT: Zapomniałem obsłużyć IOException co oznacza również serwer nie jest funkcjonowania, dodawane

Edit2: dodano manipulowanie IOException tak blisko() może wyrzucić

Edit3 a wyjątek magazynowe Exec()

+0

Dzięki temu pomogło, ale przeczytałem moją edycję. – Cloudnine1999

+0

A także, że socket.close() musiał zostać usunięty, to również spowodowało błędy. – Cloudnine1999

+0

Nie, nie powinieneś go usuwać, zmodyfikowałem swój kod, aby pokazać, jak go złapać lokalnie. Wyrzucanie IMO w przypadku operacji close() nie jest najbardziej użyteczną funkcją w Javie, ale tak właśnie jest. Przepraszam za zamieszanie, mały program testowy, którego używam do testowania takich fragmentów, miał już "throws IOException", który spowodował, że pominąłem ten problem. – fvu

Powiązane problemy