Android中实现ping功能的多种方法详解
使用java来实现ping功能。并写入文件。为了使用java来实现ping的功能,有人推荐使用java的Runtime.exec()方法来直接调用系统的Ping命令,也有人完成了纯Java实现Ping的程序,使用的是Java的NIO包(nativeio,高效IO包)。但是设备检测只是想测试一个远程主机是否可用。所以,可以使用以下三种方式来实现:
1.Jdk1.5的InetAddresss方式
自从Java1.5,java.net包中就实现了ICMPping的功能。
使用时应注意,如果远程服务器设置了防火墙或相关的配制,可能会影响到结果。另外,由于发送ICMP请求需要程序对系统有一定的权限,当这个权限无法满足时,isReachable方法将试着连接远程主机的TCP端口7(Echo)。代码如下:
publicstaticbooleanping(StringipAddress)throwsException{ inttimeOut=3000;//超时应该在3钞以上 booleanstatus=InetAddress.getByName(ipAddress).isReachable(timeOut);//当返回值是true时,说明host是可用的,false则不可。 returnstatus; }
2.最简单的办法,直接调用CMD
publicstaticvoidping1(StringipAddress)throwsException{ Stringline=null; try{ Processpro=Runtime.getRuntime().exec("ping"+ipAddress); BufferedReaderbuf=newBufferedReader(newInputStreamReader( pro.getInputStream())); while((line=buf.readLine())!=null) System.out.println(line); }catch(Exceptionex){ System.out.println(ex.getMessage()); } }
3.Java调用控制台执行ping命令
具体的思路是这样的:
通过程序调用类似“ping127.0.0.1-n10-w4”的命令,这命令会执行ping十次,如果通顺则会输出类似“来自127.0.0.1的回复:字节=32时间<1msTTL=64”的文本(具体数字根据实际情况会有变化),其中中文是根据环境本地化的,有些机器上的中文部分是英文,但不论是中英文环境,后面的“<1msTTL=62”字样总是固定的,它表明一次ping的结果是能通的。如果这个字样出现的次数等于10次即测试的次数,则说明127.0.0.1是百分之百能连通的。
技术上:具体调用dos命令用Runtime.getRuntime().exec实现,查看字符串是否符合格式用正则表达式实现。代码如下:
publicstaticbooleanping2(StringipAddress,intpingTimes,inttimeOut){ BufferedReaderin=null; Runtimer=Runtime.getRuntime();//将要执行的ping命令,此命令是windows格式的命令 StringpingCommand="ping"+ipAddress+"-n"+pingTimes+"-w"+timeOut; try{//执行命令并获取输出 System.out.println(pingCommand); Processp=r.exec(pingCommand); if(p==null){ returnfalse; } in=newBufferedReader(newInputStreamReader(p.getInputStream()));//逐行检查输出,计算类似出现=23msTTL=62字样的次数 intconnectedCount=0; Stringline=null; while((line=in.readLine())!=null){ connectedCount+=getCheckResult(line); }//如果出现类似=23msTTL=62这样的字样,出现的次数=测试次数则返回真 returnconnectedCount==pingTimes; }catch(Exceptionex){ ex.printStackTrace();//出现异常则返回假 returnfalse; }finally{ try{ in.close(); }catch(IOExceptione){ e.printStackTrace(); } } } //若line含有=18msTTL=16字样,说明已经ping通,返回1,否則返回0. privatestaticintgetCheckResult(Stringline){//System.out.println("控制台输出的结果为:"+line); Patternpattern=Pattern.compile("(\\d+ms)(\\s+)(TTL=\\d+)",Pattern.CASE_INSENSITIVE); Matchermatcher=pattern.matcher(line); while(matcher.find()){ return1; } return0; }
4.实现程序一开始就ping,运行完之后接受ping,并写入文件
完整代码如下:
importandroid.util.Log; importjava.io.BufferedReader; importjava.io.BufferedWriter; importjava.io.File; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStreamReader; importjava.io.OutputStreamWriter; importjava.net.InetAddress; importjava.net.MalformedURLException; importjava.net.URL; importjava.text.SimpleDateFormat; importjava.util.Calendar; importjava.util.Date; importjava.util.regex.Matcher; importjava.util.regex.Pattern; publicclassPing{ privatestaticfinalStringTAG="Ping"; privatestaticRuntimeruntime; privatestaticProcessprocess; privatestaticFilepingFile; /** *Jdk1.5的InetAddresss,代码简单 *@paramipAddress *@throwsException */ publicstaticbooleanping(StringipAddress)throwsException{ inttimeOut=3000;//超时应该在3钞以上 booleanstatus=InetAddress.getByName(ipAddress).isReachable(timeOut);//当返回值是true时,说明host是可用的,false则不可。 returnstatus; } /** *使用java调用cmd命令,这种方式最简单,可以把ping的过程显示在本地。ping出相应的格式 *@paramurl *@throwsException */ publicstaticvoidping1(Stringurl)throwsException{ Stringline=null; //获取主机名 URLtransUrl=null; StringfilePathName="/sdcard/"+"/ping"; FilecommonFilePath=newFile(filePathName); if(!commonFilePath.exists()){ commonFilePath.mkdirs(); Log.w(TAG,"createpath:"+commonFilePath); } SimpleDateFormatdf=newSimpleDateFormat("yyyyMMddHHmmss"); Stringdate=df.format(newDate()); Stringfile="result"+date+".txt"; pingFile=newFile(commonFilePath,file); try{ transUrl=newURL(url); StringhostName=transUrl.getHost(); Log.e(TAG,"hostName:"+hostName); runtime=Runtime.getRuntime(); process=runtime.exec("ping"+hostName); BufferedReaderbuf=newBufferedReader(newInputStreamReader(process.getInputStream())); intk=0; while((line=buf.readLine())!=null){ if(line.length()>0&&line.indexOf("time=")>0){ Stringcontext=line.substring(line.indexOf("time=")); intindex=context.indexOf("time="); Stringstr=context.substring(index+5,index+9); Log.e(TAG,"time=:"+str); Stringresult= newSimpleDateFormat("YYYY-MM-ddHH:mm:ss").format(newDate())+","+hostName+","+str+"\r\n"; Log.e(TAG,"result:"+result); write(pingFile,result); } } }catch(Exceptionex){ System.out.println(ex.getMessage()); } } /** *使用java调用控制台的ping命令,这个比较可靠,还通用,使用起来方便:传入个ip,设置ping的次数和超时,就可以根据返回值来判断是否ping通。 */ publicstaticbooleanping2(StringipAddress,intpingTimes,inttimeOut){ BufferedReaderin=null; //将要执行的ping命令,此命令是windows格式的命令 Runtimer=Runtime.getRuntime(); StringpingCommand="ping"+ipAddress+"-n"+pingTimes+"-w"+timeOut; try{ //执行命令并获取输出 System.out.println(pingCommand); Processp=r.exec(pingCommand); if(p==null){ returnfalse; } //逐行检查输出,计算类似出现=23msTTL=62字样的次数 in=newBufferedReader(newInputStreamReader(p.getInputStream())); intconnectedCount=0; Stringline=null; while((line=in.readLine())!=null){ connectedCount+=getCheckResult(line); } //如果出现类似=23msTTL=62这样的字样,出现的次数=测试次数则返回真 returnconnectedCount==pingTimes; }catch(Exceptionex){ ex.printStackTrace();//出现异常则返回假 returnfalse; }finally{ try{ in.close(); }catch(IOExceptione){ e.printStackTrace(); } } } /** *停止运行ping */ publicstaticvoidkillPing(){ if(process!=null){ process.destroy(); Log.e(TAG,"process:"+process); } } publicstaticvoidwrite(Filefile,Stringcontent){ BufferedWriterout=null; Log.e(TAG,"file:"+file); try{ out=newBufferedWriter(newOutputStreamWriter(newFileOutputStream(file,true))); out.write(content); }catch(IOExceptione){ e.printStackTrace(); }finally{ try{ out.close(); }catch(IOExceptione){ e.printStackTrace(); } } } //若line含有=18msTTL=16字样,说明已经ping通,返回1,否則返回0. privatestaticintgetCheckResult(Stringline){//System.out.println("控制台输出的结果为:"+line); Patternpattern=Pattern.compile("(\\d+ms)(\\s+)(TTL=\\d+)",Pattern.CASE_INSENSITIVE); Matchermatcher=pattern.matcher(line); while(matcher.find()){ return1; } return0; } /* *publicstaticvoidmain(String[]args)throwsException{StringipAddress="appdlssl.dbankcdn.com";// *System.out.println(ping(ipAddress));ping02();//System.out.println(ping(ipAddress,5,5000));} */ }
总结
到此这篇关于Android中实现ping功能的多种方法详解的文章就介绍到这了,更多相关androidping功能内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!