判断网络是否正常使用
-
/** * 判断网络是否正常 * @return */ public static boolean isConnect(String ipPath){ //定义其返回的状态,默认为false,网络不正常 boolean connect = false; /** * 用Runtime.getRuntime().exec()来调用系统外部的某个程序, * 他会生成一个新的进程去运行调用的程序。 * 此方法返回一个java.lang.Process对象, * 该对象可以得到之前开启的进程的运行结果, * 还可以操作进程的输入输出流。 */ Runtime runtime = Runtime.getRuntime(); Process process; try { process = runtime.exec("ping " + ipPath); InputStream is = process.getInputStream(); InputStreamReader isr = new InputStreamReader(is,"GBK"); BufferedReader br = new BufferedReader(isr); String line = null; StringBuffer sb = new StringBuffer(); while ((line = br.readLine()) != null) { sb.append(line); } System.out.println("返回值为:"+sb); is.close(); isr.close(); br.close(); if (null != sb && !sb.toString().equals("")) { String logString = ""; if (sb.toString().indexOf("TTL") > 0) { // 网络畅通 connect = true; } else { // 网络不畅通 connect = false; } } } catch (IOException e) { e.printStackTrace(); } return connect; }
TTL:生存时间
指定数据报被路由器丢弃之前允许通过的网段数量。
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
使用PING时涉及到的 ICMP 报文类型
一个为ICMP请求回显(ICMP Echo Request)
一个为ICMP回显应答(ICMP Echo Reply)
TTL 字段值可以帮助我们识别操作系统类型
测试
public static void main(String[] args) { System.out.println(HttpUtil.isConnect("220.181.111.188")); }
控制台显示
返回值为:正在 Ping 220.181.111.188 具有 32 字节的数据: 来自 220.181.111.188 的回复: 字节=32 时间=23ms TTL=53 来自 220.181.111.188 的回复: 字节=32 时间=23ms TTL=53 来自 220.181.111.188 的回复: 字节=32 时间=24ms TTL=53 来自 220.181.111.188 的回复: 字节=32 时间=23ms TTL=53220.181.111.188 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 23ms,最长 = 24ms,平均 = 23ms true Process finished with exit code 0
公众号:摘星族