2013-02-16 11 views
6

私はInetAddressを使用して自分のサーバーがオンラインかどうかを判断しています。JAVA InetAddressでポートを指定する

サーバーがオフラインの場合、サーバーを再起動します。

このプロセスは、サーバーがオンラインであるかどうかを再度確認するために5分ごとにループします。

それが正常に動作しますが、今、私が代わりにデフォルトのポート80

感謝のサーバーの状態をチェックするとき、私は、ポート43594を使用することを指定する方法を見つけ出す必要があります!ここに私のコードです:

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

編集:私は、誰かのアドバイスを取り、私はこれにそれを作ったので、

わかりました。私はすでにコメントで述べたように

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

のために処理し、例外:)(クローズが

EDIT3を投げることができるというのIOExceptionの取り扱いを追加しましたポートを含めるためにホストパラメータを変更しようとしましたか? 'cloudnine1999.no-ip.org:43594' – Vulcan

+0

[Javadoc](http://docs.oracle.com/javase/6/docs/api/java/net/InetAddress.html#isReachable%28int%29)によれば、 : '典型的な実装は特権が得られればICMP ECHO REQUESTを使用し、そうでなければ、宛先ホストのポート7(Echo)にTCP接続を確立しようとします。 ' - 使用している実装がポート80で実際にテスト接続を使用していることは確かですか? – fvu

+0

@ Vulcanありがとうございましたが、私はそれを試みました。 – Cloudnine1999

答えて

7

:しかし、今、私は、この行のコメントを解除するとき.. Runtime.getRuntime().exec("cmd /c start start.bat");

私はこのエラーを取得します。..

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

これは私の現在のコードです、Javadocによると、isReachableは、選択したポートを制御できるように実装されていません。実際には、システム権限によって許可されている場合は、マシンに対して単にpingを実行します(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()); 
    } 
}   

EDIT:IOExceptionを処理するのを忘れても、サーバーがないことを意味しています機能、

EDIT2を追加します。exec()

+0

ありがとう、それは助けたが、私の編集を読んでください。 – Cloudnine1999

+0

ああ、socket.close()も削除しなければならなかったので、エラーが出ました。 – Cloudnine1999

+0

これを削除しないでください。ローカルにキャッチする方法を示すコードを変更しました。 close()操作で例外を投げているIMOは、Javaで最も有用な機能ではありませんが、それはその方法です。混乱のために申し訳ありませんが、私がこのようなスニペットをテストするために使用する小さなテストプログラムは、すでに 'throws IOException'を持っていました。 – fvu

関連する問題