欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java实现ICMP协议的ping功能

程序员文章站 2022-07-13 23:47:24
...
package com.beijia.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Ping {

	public static boolean ping(String ipAddress) throws Exception{
		int timeOut=3000;
		boolean status=InetAddress.getByName(ipAddress).isReachable(timeOut);   // 当返回值是true时,说明host是可用的
		return status;
	}
	
	public static void ping02(String ipAddress){
		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 e) {
			System.out.println(e.getMessage());
		}
	}
	
	public static boolean ping(String ipAddress,int pingTimes,int timeOut){
		BufferedReader in=null;
		Runtime r=Runtime.getRuntime();
		String pingCommand="ping "+ipAddress+" -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()));
			int connectedCount=0;
			String line=null;
			while((line=in.readLine())!=null){
				connectedCount+=getCheckResult(line);
			}//如果出现类似=20ms TTL=22这样的字符,出现的次数=测试次数 则返回真
			return connectedCount==pingTimes;
		} catch (Exception e) {
			e.printStackTrace();//出现异常则返回假
			return false;
		}finally{
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}	
		}
	}
	
	//若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.
	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;
	}
	
	public static void main(String[] args) throws Exception{
		String ipAddress="192.168.20.58";
		System.out.println(ping(ipAddress));
		ping02(ipAddress);
		System.out.println(ping(ipAddress,5,5000));
	}
}

相关标签: ping icmp