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

来源:互联网 发布:linux apt get search 编辑:程序博客网 时间:2024/05/22 06:23

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

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 OSif(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 oselse 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命令,然后解析成自己想要的结果。

0 0