java使用ping命令實現實時網絡檢測

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;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章