java使用ping命令實現實時網絡檢測
@Slf4j
public class NetUtils {
public static volatile boolean isConnect = false;
public static void startPing() {
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleAtFixedRate(() -> {
Thread.currentThread().setName("startPing-thread");
isConnect = NetUtils.ping();
if (!isConnect) {
// 網絡異常
NettyMsgUtils.sendMsg(ResultInfo.fail(RetCodeEnum.NetWarning, WsActionEnum.netWarning.getCode()));
}
}, 1000, 2000, TimeUnit.MILLISECONDS);
}
/**
* 判斷網絡是否正常
*
* @return boolean
*/
private static boolean ping() {
//定義其返回的狀態,默認爲false,網絡不正常
// long startTime = System.currentTimeMillis();
boolean connect = false;
/**
* 用Runtime.getRuntime().exec()來調用系統外部的某個程序,
* 他會生成一個新的進程去運行調用的程序。
* 此方法返回一個java.lang.Process對象,
* 該對象可以得到之前開啓的進程的運行結果,
* 還可以操作進程的輸入輸出流。
*/
Runtime runtime = Runtime.getRuntime();
Process process;
try {
process = runtime.exec("ping baidu.com -n 1");
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "GBK");
BufferedReader br = new BufferedReader(isr);
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
}
// log.info("網絡檢查返回值爲:{}", sb);
is.close();
isr.close();
br.close();
if (!"".equals(sb.toString()) && sb.toString().indexOf("TTL") > 0) {
// 網絡暢通
// log.info("當前網絡正常!");
connect = true;
} else {
log.info("當前網絡異常!");
}
} catch (IOException e) {
log.error("isConnect() 系統異常:", e);
e.printStackTrace();
}
// log.info("檢測網速,耗時:{} ms", System.currentTimeMillis() - startTime);
return connect;
}
}