Java 实现Ping 功能

package com.hotent.monitorRecords.dateReader;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
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  
 * @throws UnsupportedEncodingException */
public boolean isReachable() throws UnsupportedEncodingException {
        BufferedReader in = null;
        Runtime r = Runtime.getRuntime();
        // 将要执行的ping命令,此命令是windows格式的命令  
        String pingCommand = "ping " + remoteIpAddress + " -n " + pingTimes    + " -w " + timeOut;
        try {  
            // 执行命令并获取输出
            System.out.println(pingCommand);   
            Process p = r.exec(pingCommand);  
            if (p == null) {   
                return false;
            }   
            in = new BufferedReader(new InputStreamReader(p.getInputStream(),"GBK"));
            // 逐行检查输出,计算类似出现=23ms TTL=62字样的次数   
            int connectedCount = 0;
            String line = null;
            while ((line = in.readLine()) != null) {
                String str=new String (line.getBytes("GB2312"),"GBK");
                System.out.println(str);
                //System.out.println("getCheckResult(line)=="+getCheckResult(line));
                connectedCount += getCheckResult(line);
            }   
            // 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真  
            //System.out.println("connectedCount=="+connectedCount);
            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) {
        // System.out.println("控制台输出的结果为:"+line);  
        Pattern pattern = Pattern.compile("(\\d+ms)(\\s+)(TTL=\\d+)",   
                Pattern.CASE_INSENSITIVE);
        //System.out.println("pattern.matcher(line)==="+pattern.matcher(line));
        Matcher matcher = pattern.matcher(line);
        //System.out.println("matcher==="+matcher);
        while (matcher.find()) {  
                return 1;  
            }
        return 0;
     }
public static void main(String[] args) {  
        Pinger p = new Pinger("192.168.2.171", 10, 5000);  
        try {
            System.out.println(p.isReachable());
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值