2013-02-16 16 views
6

Sunucumun çevrimiçi olup olmadığını belirlemek için InetAddress kullanıyorum.JAVA Bağlantı noktası InetAddress ile belirtme

Sunucu çevrimdışıysa, sunucuyu yeniden başlatır.

Bu işlem, sunucu çevrimiçi olduğunda bir kez daha kontrol etmek için her 5 dakikada bir döner.

Düzgün çalışır ama şimdi yerine varsayılan port 80

sayesinde sunucu durumunu kontrol ederken ben liman 43594 kullanmak istediğinizi belirtmek için nasıl anlamaya ihtiyacımız var! İşte benim 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(); 
     } 
    } 
} 

DÜZENLEME: birilerinin tavsiye aldı ve ben bu haline getirdiler bu yüzden

tamam. Ben bu hattı Ama şimdi .. Runtime.getRuntime().exec("cmd /c start start.bat");

bu hatayı alıyorum ..

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

Bu benim şimdiki kodudur: Zaten açıklamalarda belirtildiği gibi

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

için taşıma ve istisna:) (kapat

Edit3 atabilir IOException ele alınmasını eklendi Bağlantı noktası içerecek ana bilgisayar değiştirgesini değiştirmeyi denediniz mi? cloudnine1999.no-ip.org: 43594' – Vulcan

+0

[Javadoc] (http://docs.oracle.com/javase/6/docs/api/java/net/InetAddress.html#isReachable%28int%29) yazıyor : İmtiyazın elde edilmesi halinde, tipik bir uygulama ICMP ECHO REQUESTs'i kullanacaktır, aksi takdirde hedef host'un 7 numaralı portunda bir TCP bağlantısı kurmaya çalışacaktır. '- kullandığınız uygulamanın aslında 80 numaralı bağlantı noktasında bir test bağlantısı kullandığından emin misiniz? – fvu

+0

@Vulcan Teşekkürler ama bunu denedim. – Cloudnine1999

cevap

7

Javadoc'a göre, Değiştirilebilir seçili bağlantı noktasını kontrol etmenizi sağlayacak şekilde uygulanmaz. Aslında, sistem ayrıcalıkları tarafından izin verilirse, sadece makineye ping atacaktır (ICMP talebi).

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

DÜZENLEME: elle yapmak

(yani bir soket kullanarak) kesinlikle çalışacak ve gerçekten daha karmaşık ve/veya daha uzun değildir, aynı zamanda sunucu anlamına IOException işlemek için değil unuttum işleyen,

EDIT2 ekledi: exec()

+0

Yardım ettiğim için teşekkürler. – Cloudnine1999

+0

Oh de socket.close() kaldırılması gerekiyordu da bana hatalar verdi. – Cloudnine1999

+0

Hayır, kaldırmamalısınız, yerel olarak nasıl yakalayacağımı göstermek için kodumu değiştirdim. IMO, close() işlemlerinde istisnalar atmak Java'daki en kullanışlı özellik değil, işte bu şekilde. Bu karmaşıkları test etmek için kullandığım küçük test programında karışıklık için özür dilerim, zaten bu soruyu kaçırmak için bir 'IOException' atardım. – fvu