使用Java在多平台上进行Ping测试

7
我需要对一些IP/计算机执行ping操作。 代码可能在任何平台上执行(Windows,Linux,Mac),我需要获取有关丢失和往返时间的信息。 因此,Java的ping exec不够好,因为我需要将ping响应解析为字符串,这在不同的平台和操作系统语言中是不同的。 那么我需要做什么? 我知道有类似JNI的东西,但我是Java新手,所以需要一点帮助。 这仍然意味着我需要针对每个平台进行本地实现吗? 有示例或建议吗?

我已经使用JNI获取了ping命令。 - Sophie
4个回答

5

由于Java不是平台无关的,您可以使用System.getProperty("os.name")来查询您所在的操作系统并解析响应或根据其定义命令。

另外,您可以使用InetAddress中的isReachable(int timeout),它似乎是最接近ICMP ECHO REQUEST的实现,但它将不会提供有关丢失和往返时间的信息。

另一个想法是使用tracert/tracepath而不是ping来获取往返时间?查看此线程以获取更多信息。


1
isReachable - 尽力而为,如果 ICMP 不起作用,则切换到 TCP。 - Sophie

1

你无法使用纯Java进行真正的ICMP。然而,相当便携的jpcap库提供了一个漂亮的Java接口到本地库,包括ICMP(ping)。


0

我想解析仍然是您最简单的选择。如果您只需要这个正则表达式,那么我会感到惊讶:

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

括号中的数字表示时间,例如1141.239,可以作为参数传递给Float.parseFloat()方法。


1
是的,但如果操作系统是意大利语?中文?那么“时间”将无法工作。 - Sophie
现在这是一个问题,但参数的顺序并没有改变。你有Windows方式和UNIX方式。 - vbence
另外,您是否必须直接PING服务器?如果您对服务器有控制权,则可能只需要一个特殊的UDP回显服务器。 - vbence
是的,一定是ping。因为目的是测量丢包率和往返时间,而不是测试服务器是否存活。 - Sophie
@Sophie 对于UDP也是如此。数据包丢失也存在(因此不可靠)。此外,您甚至可以在全速运行时发送UDP数据包,这相当于洪水ping(只能由“root”用户执行)。您无法使用UDP完成以下操作:设置TTL、设置不分段、设置源路由。(最后两个仅适用于IPv4)。 - vbence

0

我使用JNI获取ping命令。 我使用本地(C)实现了ping,然后用JNI进行了封装。 缺点是需要针对每个平台编译C dll。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接