您的位置:首页 > 运维架构 > Linux

java代码实现ping命令(支持linux系统)

2016-11-13 12:38 441 查看

一.检测当前操作系统的类型

String osName = System.getProperty("os.name");//获取操作系统类型
String command = "";
if(osName.contains("Linux")){
command = "ping -c 100 -i 0"+ip;
}else if{
command = "ping -n 5 -w 1000"+ip;
}
Properties props=System.getProperties(); //获得系统属性集
String osName = props.getProperty("os.name"); //操作系统名称
String osArch = props.getProperty("os.arch"); //操作系统构架
String osVersion = props.getProperty("os.version"); //操作系统版本


二.Linux和Windows的ping指令介绍

.Ping命令通过发送Internet控制消息协议(ICMP)回响请求消息来验证与另一台TCP/IP计算机的IP级连接

.Ping命令一般用于检测网络通与不通,也叫延时,其值越大,速度越慢PING(PacketInternetGroupe),因特网包探索器,用于测试网络连接量的程序。

.Ping发送一个ICMP回声请求消息给目的地并报告是否收到所希望的ICMP回声应答。它是用来检查网络是否通畅或者网络连接速度的命令。

.原理:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。

Ping的工作流程

.1,在同一网段内

.ping

.主机A——————>主机B

.ICMP请求包

.在本机(主机A)查找ARP缓存表查找主机B的IP与其对应的MAC,

.没有找到主机B的IP与其MAC的映射关系,则发送一个arp请求广播。

.主机B接受到arp请求包后,回复一个arp应答包(里面包含本机的MAC),

.主机A<—————主机B

.ICMP应答包

.2,不在同一网段

.在主机A上运行“ping主机C(不在同一网段)”后,开始跟上面一样,到了怎样得到MAC地址时,IP协议通过计算发现C机与自己不在同一网段内,就直接将交由路由处理,也就是将路由的MAC取出来,至于怎样得到路由的MAC,跟上面一样,先在ARP缓存表找,找不到就广播包,路由得到这个数据帧后,再跟主机c进行联系,如果找不到,就向主机A返回一个超时的信息。

Linux的ping命令的使用

.ping命令的一般格式为:

ping[-dfnqrRv][-c发送次数][-i间隔秒数][-I网络界面][-l前置载入][-p范本样式][-s数据包大小][-t存活数值][主机名或IP地址]

【-ccount】指定要被发送(或接收)的回送信号请求的数目,由Count变量指出。

【-wtimeout】这个选项仅和-c选项一起才能起作用。它使ping命令以最长的超时时间去等待应答(发送最后一个信息包后)。默认超时时间为4000ms(4s)

【-d】使用Socket的SO_DEBUG功能

http://blog.csdn.net/zhangxinrun/article/details/7207733

三.ping命令的Java代码

Runtime runtime = Runtime.getRuntime();
Process process;
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is,Charset.forName("GBK"));
BufferedReader br = new BufferedReader(isr);
String line="";
String status = "";
String packetLoss = "";
String timeout = "";
while ((line = br.readLine())!=null){
Boolean bl = !"".equals(line);
//英语Linux OS
if(line.indexOf("packet loss")!=-1 && b1){
String[] str = line.split(",");
packetLoss = str[2].replace("packet loss","").trim();
status = ip+":----->丢包率:"+packetLoss;
}else if(line.indexOf("min/avg/max/mdev") !=-1&&b1){
timeout = line.split("=")[1].split("/")[1];
status+="----->延时:"+timeout
4000
+"ms"
}
//中文windows os
else if(line.indexOf("丢失") !=-1&&b1){
packetLoss = line.subString(line.indexOf("(")+1,line.indexOf(")").repalce("丢失","").replace("%","").trim())
}else if(line.indexOf("平均")!=-1&&b1){
timeout = line.substring(line.indexof("平均").split("=")[1].trim())
}
}


个人总结:项目中我需要事先监控一个IP得网络链接情况,开始不懂这样写的原理,后来写完后我明白了,其实java实现ping命令就是在cmd执行ping命令,通过java方法启动cmd执行ping命令,然后解析成自己想要的结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  command