在这之前先说一下我试的其他方法
InetAddress.getByName(ip).isReachable(3000)
这种方法是Java 1.5,java.net包中就实现了ICMP ping的功能。
这个方法有吭,不管能不能ping通老是返回true。
我也把代码搞到下面,有兴趣的可以研究一下
传授给在下 抱拳了老铁
private static final int timeOut = 3000; //超时应该在3钞以上
public static boolean isP5ing(String ip) {
boolean status = false;
if(ip != null){
try {
status = InetAddress.getByName(ip).isReachable(timeOut);
} catch(UnknownHostException e) {
} catch(IOException e) {
}
}
return status;
}
这个就是那个方法,在我这反正是不好使,不知道为什么
下面说一下我用的方法,也是在网上参照各种大神的,自己记录一下,方便以后自己回顾
上代码↓↓↓↓↓↓↓↓
public static boolean isPing(String ip) {
log.debug("ip地址为:"+ip);
if (ip == null){
return false;
}
BufferedReader in = null;
try {
Process pro = Runtime.getRuntime().exec("ping " + ip +" -n 5 -w 5000");
//GB2312 解决InputStreamReader乱码问题
in = new BufferedReader(new InputStreamReader(pro.getInputStream(),"GB2312"));
//逐行检查输出,计算类似出现=23ms TTL=62字样的次数
int connectedCount = 0;
String line = null;
while ((line = in.readLine()) != null){
log.info(line);
connectedCount += getCheckResult(line);// 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真
}
return connectedCount == 5;
} catch (Exception ex) {
ex.printStackTrace(); // 出现异常则返回假
return false;
}finally {
try {
in.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
//若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.
private static int getCheckResult(String line) { // System.out.println("控制台输出的结果为:"+line);
Pattern pattern = Pattern.compile("(\\d+ms)(\\s+)(TTL=\\d+)", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
return 1;
}
return 0;
}
这个方法的思路就是使用runtime执行doc命令,把执行命令返回的结果进行正则表达式进行匹配,如果匹配成功了,说明就ping通啦。
下面是我输出在控制台的信息,是和小黑框里输出的是一样的。
ping 通的
ping不通的