2013-06-17 18 views
15

Ich möchte überprüfen, ob Server-Anwendung verfügbar ist. Nachdem der Server gestartet wurde, möchte ich die Überprüfung stoppen, bis der Server den Status ändert. Wie geht das mit meinem Code:Prüfen, ob der Server von Java-Code online ist

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

Gibt es einen besseren Weg, um das zu lösen?

+1

das statische Feld 'connected' ziemlich nutzlos zu sein scheint, weil man es nie –

+0

Nun ändern, wird dies überprüfen, ob das Host/Port-Paar vorhanden ist, aber es wird nicht überprüfen alles funktional ... Es könnte sein, dass die Serving-Software hinter ist Fubar und gibt immer 500 für HTTP, zum Beispiel – fge

+0

Dies könnte Ihnen helfen http://stackoverflow.com/questions/9552743/proper-way-to-test-if -server-is-up-in-java Ihre URL (URL_TO_APPLICATION) könnte SERVER_ADDRESS sein + TCP_SERVER_PORT Siehe auch http://www.codeanch.com/t/205709/sockets/java/check-server –

Antwort

2

Überprüfen Sie zuerst, ob der Server läuft und der Server die Verbindung akzeptiert.

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; 
} 
+2

Der Code für alle drei 'catch' Blöcke ist derselbe; es könnte in eins zusammengeführt werden (und sollte in diesem Fall wahrscheinlich sein). –

+6

Es wäre besser anzunehmen, dass der Server nicht verfügbar ist ('boolean available = false'), und setzen Sie ihn dann auf true, wenn Sie ihn nur erreichen können. Auf diese Weise, wenn es eine Ausnahme oder etwas Pannen gibt, verbinden wir uns nicht weiter auf der Grundlage eines jetzt inkorrekten booleschen Wertes. –

+0

@AaronDigulla Ich bin mir nicht sicher, ob er J7 – Murali

21

Das Kontrollverfahren kann wie folgt geschrieben werden (Java 7 und höher):

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

Neben die Ausnahmebehandlung zu vereinfachen, dies beseitigt ein nervtötendes Socket Leck. (Wenn Sie mit der Zeit betroffen sind getroffen, um diese Überprüfung zu tun, stellen Sie dann eine Verbindung Timeout vor zu versuchen, eine Verbindung: siehe Setting a timeout for socket operations)

Aber die Probleme mit diesem Ansatz sind viele Ziele verfolgt:

  • Es testet nur, dass etwas auf Verbindungen wartet. Wenn sich Ihr Dienst hinter einem Proxy befindet ... oder von etwas wie dem inetd Dienst verwaltet wird, dann bedeuten die akzeptierten Verbindungen nicht, dass Ihr Dienst tatsächlich funktioniert.

  • Dies wird dazu führen, dass Ihr Dienst Verbindungen "sieht", die schließen, ohne eine Anfrage zu senden. Sie sollten also Ihren Dienst so programmieren, dass er "elegant" damit umgehen kann.

  • Dies wird wiederholt zur Netzwerk- und Serverlast hinzugefügt.

  • Wenn Sie ein kurzes Zeitlimit setzen, weil Sie nicht wollen, dass der Test "einfriert", dann riskieren Sie, es zu kurz zu setzen und den Host zu bewerten, wenn er nicht aktiv ist.


Nachdem Server gestartet wird Ich möchte Überprüfung stoppen, bis der Server-Status ändert

Das fast unmöglich ist. Der Grund dafür ist, dass Sie nicht feststellen können, ob der Server den Status "geändert" hat, ohne zu prüfen. Oder zumindest, Sie können dies nicht tun, ohne einen ausgeklügelten Statusbenachrichtigungsdienst zu implementieren, bei dem der Server den Client anruft, um ihm mitzuteilen, dass er den Status ändert. (Und wenn "Status ändern" beinhaltet "sterben" oder "verlorene Netzwerkverbindung", dann können Sie nicht machen Benachrichtigung zuverlässig ... wenn überhaupt.)

+0

diese Methode funktioniert nicht für mich. Ich erhalte keinen Fehler oder irgendetwas, Meine App "friert" einfach ein wie zuvor – keinabel

+1

Siehe mein Update .... –

+0

Funktioniert nur, wenn der Server derzeit –

-1

Ich habe diese Methode für meine 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; 
} 
+0

Keine Erklärung. Keine gute Antwort. –

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

arbeiten, aber das Problem ist, dass, wenn Sie am Telefon Throught WI-FI schalten Sie ihn zu einem „Vollbremsung“ kommt und keine Aktion. zum Nachdenken ... =)

nächsten Code wird über WI-FI arbeiten ...wenn Sie die Verbindungszeit erhöhen -

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