2011-10-07 23 views
16

我想測試遠程系統是否可以使用Java訪問,換句話說,使用Java發送「ping」命令。此功能應與布爾值的方法進行封裝,例如如何測試遠程系統是否可達

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

我測試過的java程序類,但我不認爲這是做最好的辦法,因爲複雜的輸出處理與OutputBuffers。

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

另一種可能性是創建一個Socket連接,處理拋出的異常,但如果遠程系統是一個「裸」 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通本地子網之外的主機。 最可能的原因是windows正在使用ICMP ping而isReachable()未能使用它。這是至少Java 6的情況。 – flash

+5

在原生'isReachable0'方法實現中(在'Inet4AddressImpl.c中)有一個註釋,它說「Windows的ICMP和RAW套接字的實現目前太不可靠了,因此最好不要嘗試一切,只依靠TCP,我們可能會在未來重新訪問並啓用此代碼。「 ' –

+0

已確認,在我的WXP測試機器中,此命令默認爲端口7上的TCP連接(回顯)。即使對於不存在的IP,或防火牆被阻止,它也會返回可達性。 OMG! –

4

它看起來像你使用Linux,所以你可能會發現isReachable()是不可靠的(因爲你沒有權限發送ICMP數據包,非常很少有服務器運行Echo服務)。

如果是這樣的話,那麼我想你需要使用產卵在你建議的方式方法,但我建議使用如下命令:

ping -c 1 hostname 

這一次嘗試之後終止,然後您可以檢查進程的退出狀態 - 比解析標準輸出更可靠。

Ping在失敗時返回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; 
} 
相關問題