2013-06-17 11 views
15

サーバアプリケーションが利用可能かどうかをチェックしたいと思います。サーバーの起動後、サーバーの状態が変わるまでチェックを止めたい。どのように私のコードでそれを行うには:Javaコードからサーバがオンラインになっているかどうかを調べる

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

これを解決するための任意のより良い方法はありますか?

+1

静的フィールド 'connected'あなたは –

+0

まあ、これはホスト/ポートのペアが利用可能かどうかをチェックしますが、それはチェックしません、それを変更することはありませんので、かなり無用のようです機能的なもの...それは、サービング・ソフトウェアが背後めちゃくちゃである可能性がありますし、常にこれはあなたを助けることができるインスタンス – fge

+0

ため、http://stackoverflow.com/questions/9552743/proper-way-to-test-if HTTP 500を返しますあなたのURL(URL_TO_APPLICATION)はSERVER_ADDRESS + TCP_SERVER_PORTもこのhttp://www.coderanch.com/t/205709/sockets/java/check-server –

答えて

2

まず、サーバーが実行中で、サーバーが接続を受け入れるかどうかを確認します。

(後のJava 7と)以下のようにチェック方法を書き換えることができる
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

3つの 'catch'ブロックのコードはすべて同じです。それは1つにマージされる可能性があります(そして、おそらくこの場合にすべきです)。 –

+6

サーバが利用可能ではないと仮定すること( 'boolean available = false')が望ましいでしょう。そして、あなたがそれに到達できる場合にのみ、それをtrueに設定してください。そうすれば、例外や何か不具合がある場合、私たちは間違ったブール値に基づいて接続を継続しません。 –

+0

@AaronDigulla J7 – Murali

21

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

例外処理を簡素化することに加えて、これは厄介なSocket漏れを排除します。

しかし、このアプローチには問題が何倍ある:(Setting a timeout for socket operationsを参照してください、あなたはこのチェックを行うために要する時間に関係している場合は、接続しようとする前に、接続タイムアウトを設定):

  • それを何かをテストするだけです。は接続を待ち受けています。あなたのサービスがプロキシの背後にある場合、またはinetdサービスのように管理されている場合...受け入れられた接続がサービスが実際に動作しているとは限りません。

  • これは、リクエストを送信せずに閉じるサービスを「見る」ようになります。だから、あなたはこれを "優雅に"扱うようにサービスをコーディングする方が良いでしょう。

  • これを繰り返し行うと、ネットワークとサーバーの負荷が増加します。

  • テストを「フリーズ」したくないために短いタイムアウトを設定した場合、それを短く設定し、ホストが停止していないと判断する危険性があります。


は、サーバーが開始された後、私は、サーバーが不可能に近い状況

を変更するまでチェックを停止します。その理由は、サーバーがチェックせずに「変更されたステータス」を持っているかどうかを知ることができないためです。または、サーバと呼んで、状態が変化していることをクライアントに知らせる、精巧な状態通知サービスを実装しなければ、少なくともこれを行うことはできません。 (「変更ステータス」に「死んでいる」または「ネットワーク接続が失われている」が含まれている場合は、通知が信頼できるものであれば、にすることはできません)。

+0

この方法は私のためには機能しません。 – keinabel

+1

が私の更新を参照してくださいする前にそれがなかったように私は、エラーか何か、私のアプリだけで「フリーズ」を受信して​​いない.... –

+0

サーバが現在明らか –

-1

私はこのメソッドをmy 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

説明はありません。良い答えではありません。 –

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

作業が、問題は、あなたはWI-FI throught電話の電源をオンにしたとき、それは「急停止」とノーアクションに来るということです。思考のために=)

次のコードはWI-FIを介して作業することになります...あなたは接続時間を増やす場合 -

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; 
} 
関連する問題