2011-10-07 9 views
16

リモートシステムがJavaを使用して到達可能かどうか、つまりJavaを使用して「pingを送信する」かどうかをテストします。この機能は、私は、Java Processクラスをテストしてみたリモートシステムに到達可能かどうかをテストする方法

public boolean isReachable(String ip) { 
    // what to do :-) 
} 

例えば、ブール値を持つメソッドにカプセル化されなければならないが、私はそれがあるため、複雑で、これを行うための最善の方法であるとは思いませんOutputBuffersでの出力処理。

Process proc = Runtime.getRuntime().exec("ping " + ip); 

別の可能性ソケット接続を作成し、スローされた例外を処理するだろうが、リモートシステムが「裸」UNIXシステムであれば、:-)さらに他の側面にはソケットがないかもしれませんが、私は思いますリモートシステムに到達できないときにタイムアウトを設定できるようにします。

どうすればいいですか?ありがとうございました!

+0

どのような目的のためにですか?接続したいサーバーがある場合は、接続しようとします。 – EJP

答えて

34
InetAddress.getByName(ip).isReachable(timeout); 
+1

OMG!本当にありがとうございました:-)私が探していたものを正確に! – strauberry

+5

特定のポートに到達可能かどうか確認できますか? – tasomaniac

+0

@tasomaniacこのようなものを試してみてください:http://pastebin.com/DuwZ6s5E(未テスト) – scotty86

9

InetAddress.getByName(host).isReachable(timeOut)hereを見て)

+6

isReachable()は、ローカルサブネットの外部にあるホストに確実にpingすることを信頼できません。 最も可能性の高い理由は、ウィンドウがICMP pingを使用していて、isReachable()がそれを使用していないことが原因です。これは少なくともJava 6までのケースです。 – flash

+5

ネイティブの 'isReachable0'メソッド実装(' Inet4AddressImpl.c ')には、「Windows実装のICMPとRAWソケットはあまりにも信頼性が低い」というコメントがあります。まったく試してみるとTCPだけに依存しています。今後このコードを再確認して有効にすることができます」 ' –

+0

私のWXPテストマシンでは、このコマンドはデフォルトでポート7(エコー)のTCP接続に設定されています。 IPが存在しない場合や、ファイアウォールがブロックされている場合でも到達可能です。 –

4

Linuxを使用しているようにあなたはおそらくisReachable()あなたはICMPパケットを送信する権限を持っていないので(信頼できない、と非常にことがわかりますように見えますエコーサービスを実行しているサーバーはほとんどありません)。

その場合は、私は好きあなたがお勧めの方法でプロセスを生成使用する必要がありますが、私はコマンドを使用することをお勧めだと思う:これは1回の試行後に終了します

ping -c 1 hostname 

とプロセスの終了状態を調べることができます。標準出力を解析するよりもずっと信頼性があります。

Pingは成功した場合は0を返し、失敗した場合は0以外を返します。

+0

このアドバイスをいただきありがとうございます! bugtrackerに「改善」というエントリを作成します:-) – strauberry

0

私はこの質問が答えを見つけたことを知っていますが、私は "コピー貼り付け"のために私のコードを追加したいと思います。

public boolean isIpReachable(String ip, int timeout){ 
    boolean state = false; 

    try { 
     state = InetAddress.getByName(ip).isReachable(timeout); 
    } catch (IOException e) { 
     //Parse error here 
    } 

    return state; 
} 
関連する問題