2011-05-30 63 views
7

我需要對某些ip /機器執行ping。該代碼可以在任何類型的平臺(Windows,Linux,Mac)上執行,我需要獲取有關丟失和往返時間的信息。 因此,java的ping執行不夠好,因爲那時我需要將ping響應解析爲字符串,每個平臺和每種操作系統語言都是不同的。 那麼我需要做什麼?我知道有一些像JNI,但我是新來的Java,所以需要一點幫助。 它仍然意味着我需要在每個平臺上進行本地實施? 任何示例或建議?用java ping多平臺

+0

我已經使用JNI來獲取ping命令。 – Sophie 2011-06-22 11:13:30

回答

0

我已經使用JNI來獲取ping命令。 我已經使用native(C)實現了ping,然後用JNI包裝它。 降級是需要編譯每個平臺的C DLL。

1

你不能用純Java來做真正的ICMP。雖然合理的便攜式jpcap庫爲本地庫提供了一個不錯的Java接口,包括ICMP(ping)。

0

我想解析仍然是最簡單的選擇。如果你需要比這更多的正則表達式我會很驚訝:

time[<=]([0-9.]+)[ ]?ms 

用括號括起來,你會得到的時間像1141.239可送入Float.parseFloat()

+1

是的,但如果操作系統是意大利語?中國人?那麼「時間」將不起作用。 – Sophie 2011-05-30 14:15:22

+0

現在這是一個問題,參數的順序仍然沒有改變。你有Windows方式和UNIX方式。 – vbence 2011-05-30 14:26:13

+0

另外:你必須從字面上PING服務器?可能是一個特殊的UDP回顯服務器就夠了。 (如果你有控制服務器)。 – vbence 2011-05-30 14:42:51

5

由於java不是平臺獨立的,因此您可以詢問您使用System.getProperty("os.name")的哪個操作系統,並解析響應或根據它來定義命令。

或者,您可以使用isReachable(int timeout)中的InetAddress這似乎是最接近ICMP ECHO REQUEST的實現,但它不會提供關於丟失和往返時間的信息。

另一個想法是使用tracert/tracepath而不是ping來獲取往返行程?有關更多信息,請查詢this thread

+1

isReachable - 盡力而爲,如果icmp不起作用,它將切換到TCP。 – Sophie 2011-05-31 05:49:35