2013-02-16 7 views
6

Ich verwende InetAddress, um festzustellen, ob mein Server online ist.JAVA Angeben des Ports mit InetAddress

Wenn der Server offline ist, wird der Server neu gestartet.

Dieser Prozess wird alle 5 Minuten wiederholt, um erneut zu prüfen, ob der Server online ist.

Es funktioniert gut, aber jetzt brauche ich, herauszufinden, wie zu spezifizieren, dass ich Port 43594 verwenden möchten, wenn Sie den Server-Status anstelle des Port Standard Überprüfung 80.

Dank! Hier ist mein Code:

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:

Okay, so ich jemandes Rat nahm und ich habe es in diese. Aber jetzt, wenn ich diese Zeile Kommentar- .. Runtime.getRuntime().exec("cmd /c start start.bat");

ich diesen Fehler ..

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

Dies ist mein aktueller Code:

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

Umgang mit Ausnahme Haben Sie versucht, den Hostparameter so zu ändern, dass er den Port enthält? 'cloudnine1999.no-ip.org: 43594' – Vulcan

+0

Die [Javadoc] (http://docs.oracle.com/javase/6/docs/api/java/net/InetAddress.html#isReachable%28int%29) sagt : 'Eine typische Implementierung verwendet ICMP ECHO REQUESTs, wenn die Berechtigung erhalten werden kann, andernfalls wird versucht, eine TCP-Verbindung auf Port 7 (Echo) des Zielhosts aufzubauen. '- Sind Sie sicher, dass die Implementierung, die Sie verwenden, tatsächlich eine Testverbindung auf Port 80 verwendet? – fvu

+0

@Vulcan Danke, aber ich habe das versucht. – Cloudnine1999

Antwort

7

Wie ich bereits in den Kommentaren erwähnt , gemäß der Javadoc isReachable ist nicht so implementiert, dass Sie den ausgewählten Port steuern können. Wenn dies durch Systemprivilegien erlaubt wird, wird es tatsächlich den Computer anpingen (ICMP-Anfrage).

es manuell tun (dh eine Buchse verwendet wird) wird sicherlich arbeiten und nicht wirklich komplizierter ist und/oder länger:

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: vergessen IOException zu handhaben, die auch den Server bedeutet nicht funktioniert, hinzugefügt

EDIT2: die Handhabung der IOException fügte hinzu, dass close()

EDIT3 werfen kann: und für exec()

+0

Danke, es half, aber lesen Sie meine Bearbeitung. – Cloudnine1999

+0

Oh auch die socket.close() musste entfernt werden es gab mir auch Fehler. – Cloudnine1999

+0

Nein, Sie sollten es nicht entfernen, ich habe meinen Code geändert, um zu zeigen, wie man ihn lokal fängt. Das Auslösen von Ausnahmen durch IMO für close() -Operationen ist nicht das nützlichste Feature in Java, aber so ist es. Sorry für die Verwirrung, das kleine Testprogramm, das ich benutze, um solche Schnipsel zu testen, hatte bereits eine "throws IOException", die dazu führte, dass ich dieses Problem vermisste. – fvu

Verwandte Themen