Java代码实现ping命令

Java代码实现ping命令

​ 在一个项目中,遇到了一个问题,需要查看某个IP是否能够ping通,这里就直接使用Java代码实现了,记录一下。

​ 先说一下实现的几个方法。

  • Jdk1.5的InetAddresss方式

  • 调用本机CMD

  • Java调用控制台执行ping命令

​ 下面也就不不废话了,直接上代码吧。

package network_train;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;

/**
 * NetWorkTrain.java
 * Description: 网络测试demo
 *
 * @author Peng Shiquan
 * @date 2020/6/14
 */
public class NetWorkTrain {
    /**
     * Description: 主方法
     *
     * @param args
     * @return void
     * @Author: Peng Shiquan
     * @Date: 2020/6/15
     */
    public static void main(String[] args) {
        String ipAddress = "192.168.16.127";


        try {
            /**
             * Jdk1.5的InetAddresss方式
             */
            System.err.println("Jdk1.5的InetAddresss方式");
            System.err.println("主机的状态," + pingforInetAddresss(ipAddress));

            /**
             * 直接调用CMD
             */
            System.err.println("直接调用CMD");
            //pingForCMD(ipAddress);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.err.println("更加完善的调用CMD方法");
        System.err.println("主机的状态" + pingForExec(ipAddress, 5, 1000));
    }

    /**
     * Description: Jdk1.5的InetAddresss方式,返回值是true时,说明host是可用的
     *
     * @param ipAddress
     * @return boolean
     * @Author: Peng Shiquan
     * @Date: 2020/6/15
     */
    public static boolean pingforInetAddresss(String ipAddress) throws Exception {
        //超时应该在3秒以上
        int timeOut = 3000;
        // 当返回值是true时,说明host是可用的,false则不可。
        boolean status = InetAddress.getByName(ipAddress).isReachable(timeOut);
        return status;
    }

    /**
     * Description: 直接调用CMD,方法直接将CMD窗口的信息打印出来
     *
     * @param ipAddress
     * @return void
     * @Author: Peng Shiquan
     * @Date: 2020/6/15
     */
    public static void pingForCMD(String ipAddress) throws Exception {
        String line = null;
        try {
            Process pro = Runtime.getRuntime().exec("ping " + ipAddress);
            BufferedReader buf = new BufferedReader(new InputStreamReader(
                    pro.getInputStream()));
            while ((line = buf.readLine()) != null)
                System.out.println(line);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }

    /**
     * Description: 更加完善的调用CMD方法
     *
     * @param ipAddress
     * @param pingTimes
     * @param timeOut
     * @return boolean
     * @Author: Peng Shiquan
     * @Date: 2020/6/15
     */
    public static boolean pingForExec(String ipAddress, int pingTimes, int timeOut) {
        BufferedReader in = null;
        // 将要执行的ping命令,此命令是windows格式的命令
        Runtime r = Runtime.getRuntime();

        String pingCommand = "ping " + "-c " + pingTimes + " " + ipAddress;

        try {   // 执行命令并获取输出
            System.out.println(pingCommand);
            Process p = r.exec(pingCommand);
            if (p == null) {
                return false;
            }
            // 逐行检查输出,计算类似出现=23ms TTL=62字样的次数
            in = new BufferedReader(new InputStreamReader(p.getInputStream()));
            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 {
                if (null != in) {
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Description: 若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.
     *
     * @param line
     * @return int
     * @Author: Peng Shiquan
     * @Date: 2020/6/15
     */
    private static int getCheckResult(String line) {
        //System.out.println("控制台输出的结果为:" + line);
        String trueZF = "time=";
        if (line.contains(trueZF)) {
            return 1;
        } else {
            return 0;
        }
    }
}

​ 运行的截图如下:

​ 成功的:

image-20200615154620793

​ 失败的:

image-20200615154550305

​ 下面就说说中间的问题。

​ 一个是不同的电脑系统,代码中的命令是不一样的,我这里的是Mac os,所以命令和Windows上面的有所不同。

  • Mac os(或者Linux):ping -c 5 127.0.0.1

  • Windows: ping 127.0.0.1 -n 5 -w 1000

​ 所以不同的系统要拼接的命令也是不一样的。然后就是需要注意最后结果的分析,我这里的代码是直接判断有没有time=,有就是成功了。大家也可以根据自己的需求对延迟做一定对要求,我这里比较简单,就没有写的太复杂。到这里就基本完成了。

​ 就这样吧,结束。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值