import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Pinger {
/**
* 要ping的主机
*/
private String remoteIpAddress;
/**
* 设置ping的次数
*/
private final int pingTimes;
/**
* 设置超时
*/
private int timeOut;
/**
* 构造函数
*
* @param remoteIpAddress
* @param pingTimes
* @param timeOut
*/
public Pinger(String remoteIpAddress, int pingTimes, int timeOut) {
super();
this.remoteIpAddress = remoteIpAddress;
this.pingTimes = pingTimes;
this.timeOut = timeOut;
}
/**
* 测试是否能ping通
*
* @param server
* @param timeout
* @return
*/
public boolean isReachable() {
BufferedReader in = null;
Runtime r = Runtime.getRuntime();
// 将要执行的ping命令,此命令是windows格式的命令
String pingCommand = "ping " + remoteIpAddress + " -n " + pingTimes + " -w " + timeOut;
try {
Process p = r.exec(pingCommand);
if (p == null) {
return false;
}
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
// 逐行检查输出,计算类似出现=23ms TTL=62字样的次数
int connectedCount = 0;
String line = null;
while ((line = in.readLine()) != null) {
connectedCount += getCheckResult(line);
}
// 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真
return connectedCount == pingTimes;
} catch (Exception ex) {
ex.printStackTrace();
return false;
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.
*
* @param line
* @return
*/
private static int getCheckResult(String 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;
}
转载于:https://my.oschina.net/syso4yy/blog/591455