一.检测当前操作系统的类型
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功能
三.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+"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命令,然后解析成自己想要的结果。