Android 使用ping命令判断当前网络状态

一. 介绍

        ping命令是用来测试和诊断网络连接问题的基本命令,当然我们的终端设备(手机/平板/车机)都可以用这个命令来判断当前网络是否有流量的状态,本篇文章主要介绍Linux的ping命令,因为Android系统也是使用了Linux内核。然后使用ping命令封装一个判断当前网络是否有流量的方法。

二. 作用

使用ping命令作用:

1. 检测网络连接问题:如果我们无法访问某个网站或主机,可以使用ping命令来检测网络连接是否正常。如果ping命令能够成功收到目标主机的回复,说明网络连接正常;如果无法收到回复,可能是网络故障或目标主机不可达。

2. 测量网络延迟:通过ping命令可以测量网络延迟,即从发送ICMP(Internet Control Message Protocol)(Internet控制消息协议)请求到接收到回复所需的时间。可以使用ping命令的-c选项指定发送的ICMP请求次数,然后计算平均延迟时间。较高的延迟可能会导致网络连接缓慢,需要进一步排查网络问题。

3. 检测丢包率:ping命令还可以用于检测网络丢包率,即发送的ICMP请求在传输过程中丢失的比例。可以观察ping命令的输出结果中的丢包率字段,如果丢包率较高,可能是网络拥堵或目标主机负载过高。

三. 使用格式

ping [参数] [主机名或IP地址]

ping命令运行在命令提示符终端,用法为:“ping 参数 目标主机”。其中参数为零到多个,目标主机可以是IP或者域名。

如下图:

ping命令它会持续不断地给目标IP发送ICMP数据报,上面的截图中的每一行代表了一个从ICMP响应的信息,具体包括:

icmp_seq:ICMP 数据包序号,从1开始递增,如果中间不连续代表丢包了。
ttl:生存时间,具体指允许数据包之间通过多少个路由器或跳数,数据包每经过一个路由器,ttl会减1,当ttl归零时,这个数据包的生成周期结束,处理它的路由器会丢弃这个数据包。默认情况下,Linux系统的TTL值为64或255。
time: 这个数据报的响应时间,时间越短,代表响应速度越快。
然后是统计信息,它告诉我们,一共有12个数据报被传递,全被接收,没有数据包丢失。最后一行是:最小/最大/平均响应时间和本机硬件耗费时间。

看下所有的参数:

 ping -help
Usage: ping [-aAbBdDfhLnOqrRUvV64] [-c count] [-i interval] [-I interface][-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos][-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option][-w deadline] [-W timeout] [hop1 ...] destination
Usage: ping -6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface][-l preload] [-m mark] [-M pmtudisc_option][-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize][-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline][-W timeout] destination

好了,到这里,我们来介绍一下它的参数:

参数详解
-aAudible ping. 
-A自适应ping,根据ping包往返时间确定ping的速度;
-c countping指定次数后停止ping;
-i interval设定间隔几秒发送一个ping包,默认一秒ping一次;
-I interface指定网卡接口、或指定的本机地址送出数据包;
-l preload设置在送出要求信息之前,先行发出的数据包;
-q不显示任何传送封包的信息,只显示最后的结果
-Q tos设置Qos(Quality of Service),它是ICMP数据报相关位;可以是十进制或十六进制数,详见rfc1349和rfc2474文档;
-R记录ping的路由过程(IPv4 only);
注意:由于IP头的限制,最多只能记录9个路由,其他会被忽略;
-s packetsize指定每次ping发送的数据字节数,默认为“56字节”+“28字节”的ICMP头,一共是84字节;
包头+内容不能大于65535,所以最大值为65507(linux:65507, windows:65500);
-t ttl设置TTL(Time To Live)为指定的值。该字段指定IP包被路由器丢弃之前允许通过的最大网段数;
-T timestamp_option

设置IP timestamp选项,可以是下面的任何一个:
'tsonly' (only timestamps)
'tsandaddr' (timestamps and addresses)
'tsprespec host1 [host2 [host3]]' (timestamp prespecified hops).

-v使ping处于verbose方式,它要ping命令除了打印ECHO-RESPONSE数据包之外,还打印其它所有返回的ICMP数据包;
-W timeout以毫秒为单位设置ping的超时时间;
-w deadlinedeadline;  单位 秒

其实常用的就是如下几个:

ping常用命令选项:

-c count:指定发送的ICMP请求次数,默认为无限次。

-i interval:指定发送ICMP请求的时间间隔,默认为1秒。

-s packetsize:指定发送的ICMP请求的数据包大小,默认为56字节。

-W timeout:指定等待ICMP回复的超时时间,默认为10秒。

-w 10   : 最长超时时间为10秒

四. 实际使用

使用ping命令访问阿里公共DNS,来判断当前网络是否有流量,间接的判断当前网络是否可用,目前国内公共的DNS有:

服务商公共DNS服务器IP公共DNS服务器IP
阿里DNS223.5.5.5223.6.6.6
114公共DNS114.114.114.114
百度DNS180.76.76.76
腾讯DNS119.29.29.29
电信101.226.4.6
联通123.125.81.6
移动101.226.4.6
谷歌8.8.8.88.8.4.4
IBM Quad9DNS9.9.9.9
微软DNS4.2.2.1
华为DNS139.9.23.90122.112.208.1
114.115.192.11116.205.5.1

代码如下:

 public boolean isNetworkHasTraffic() {Runtime runtime = Runtime.getRuntime();java.lang.Process ipProcess = null;try {ipProcess = runtime.exec("ping -c 4 -i 0.2 -w 1 223.5.5.5");InputStream inputStrem = ipProcess.getInputStream();BufferedReader in = new BufferedReader(new InputStreamReader(inputStrem));StringBuffer stringBuffer = new StringBuffer();String content = "";while ((content = in.readLine()) != null) {stringBuffer.append(content);}int exitValue = ipProcess.waitFor();Log.i(TAG, "return result after executing the ping command: " + exitValue);if (exitValue == 0) {//网络正常且有流量return true;} else if (exitValue == 1) {if (stringBuffer.indexOf("100% packet loss") != -1) {//状态值返回1 网络丢包严重,判断为网络未连接return false;} else {return true;}} else if (exitValue == 2) {// 状态值返回2  网络未连接不可用return false;} else {// 其他异常场景return false;}} catch(IOException | InterruptedException e) {e.printStackTrace();} finally {if (ipProcess != null) {ipProcess.destroy();}runtime.gc();}return false;}

该方法中的ping 命令:

ping -c 4 -i 0.2 -w 1 223.5.5.5

发送4次数据, 每次间隔200毫秒,deadline 为1秒执行完成   

233.5.5.5 为阿里DNS

ping -c 4 -i 0.2 -w 1 223.5.5.5
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.
64 bytes from 223.5.5.5: icmp_seq=1 ttl=114 time=87.7 ms
64 bytes from 223.5.5.5: icmp_seq=2 ttl=114 time=71.0 ms
64 bytes from 223.5.5.5: icmp_seq=3 ttl=114 time=72.2 ms
64 bytes from 223.5.5.5: icmp_seq=4 ttl=114 time=71.0 ms--- 223.5.5.5 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 601ms
rtt min/avg/max/mdev = 71.007/75.506/87.732/7.084 ms

返回值是通过调用 Process.waitFor() 方法,根据实际测试用例场景

1. 打开和关闭 手机流量开关  当正常上网时,返回值为0   关闭流量开关: 返回值2 

2. 连接上有流量的Wifi热点,正常上网时,返回值为0

3. 连接上没有流量的Wifi热点, 无法上网,返回值为1 ,此时丢包率是100%

五. 注意事项

java中 Process的waitFor() 方法说明

JDK帮助文档上这么说:如有必要,一直要等到由该 Process 对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。但是直接调用这个方法会导致当前线程阻塞,直到退出子进程。

也就是说: 此方法不建议使用在主线程中,因为ping网络的过程是一个耗时操作,Process的waitFor()方法会阻塞当前线程 直接导致结果: 阻塞UI线程。

        经过实际测试,确实会影响主线程,验证过程: 我把这个方法写在生命周期onStart()方法中,onResume() 就会延时1秒执行。那么UI界面也会延时1秒显示,这对用户追求系统流畅角度来看,这当然是不允许的。

        当然waitFor()方法除了 0/1/2 还有很多返回值,详细见:Process.waitFor()方法的返回值

 

六. 方法封装

在第5小节,我们已经说明此方法不建议使用在主线程中,下面是封装的方法和使用代码

使用方法一:

new Thread(new Runnable() {@Overridepublic void run() {boolean isAvalible =  isNetworkHasTraffic();//根据这个判断条件去处理对应的业务逻辑if (isAvalible) { Log.d(TAG, " 网络正常 ");} else {Log.d(TAG, " 当前网络不可用 ");}}}).start();

        

使用方法二:使用AsyncTask,把耗时操作放在doInBackground方法中,在子线程中做ping操作,当结果返回时,在onPostExecute主线程中更新状态。

/*Params:决定了执行excute()方法时传入的参数类型,excute()方法传入的参数会传入到方法doInBackground(),所以同时也决定了doInBackground()方法内的参数类型。Progress:任务执行时,返回进度值的类型,即onProgressUpdate()方法内的参数类型。Result:任务完成后,返回的结果的类型,即doInBackground()方法的返回类型,doInBackground()方法的返回结果传入onPostExecute()方法作为参数,所以同时也决定了onPostExecute()方法的参数类型。** */private abstract class getNetworkStatusTask extends AsyncTask<Void,Void,Boolean> {@Overrideprotected Boolean doInBackground(Void... voids) {return isNetworkHasTraffic();}//定义为抽象方法,在子类复写@Overrideprotected abstract void onPostExecute(Boolean aBoolean);}//调用代码new getNetworkStatusTask(){@Overrideprotected void onPostExecute(Boolean hastraffic) {//根据判断条件处理业务逻辑代码if (hastraffic) {Log.d(TAG, "====网络正常=====");} else {Log.d(TAG, "====网络不可用=====");}}}.execute();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI官宣位于东京的首个亚洲办公室,并将发布专为日语优化的GPT-4定制模型!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

科技云报道:AI大模型疯长,存储扛住了吗?

科技云报道原创。 AI大模型正在倒逼数字基础设施产业加速升级。 过去一年半&#xff0c;AI大模型标志性的应用相继出现&#xff0c;从ChatGPT到Sora一次次刷新人们的认知。震撼的背后&#xff0c;是大模型参数指数级的增长。 这种数据暴涨的压力&#xff0c;快速传导到了大模…

Unity 3D定点数物理引擎实战系列:BEPU物理引擎碰撞计算与碰撞规则的架构与设计

前面我们讲解了如何监听物理引擎的碰撞事件, 在物理引擎内核中如何架构与设计碰撞规则,使得物理Entity与周围的物理环境产生碰撞时&#xff0c;如何灵活的控制物理碰撞&#xff0c;本节給大家详细的讲解BEPUphysicsint 物理引擎内部是如何管理与控制碰撞规则的。本文主要讲解3个…

HTML的超链接

前言&#xff1a; 如图&#xff0c;我们在浏览网页时经常可以看到这样的字体&#xff08;点击便跳转到了别的地方了&#xff09;&#xff0c;今日就和各位一起学习一下超链接的相关知识。 相关知识1&#xff1a; 超链接的标签为&#xff1a;a ~使用格式为&#xff1a; <a h…

node.js服务器静态资源处理

前言&#xff1a;node.js服务器动态资源处理见 http://t.csdnimg.cn/9D8WN 一、什么是node.js服务器静态资源&#xff1f; 静态资源服务器指的是不会被服务器的动态运行所改变或者生成的文件. 它最初在服务器运行之前是什么样子, 到服务器结束运行时, 它还是那个样子. 比如平…

单元测试四大过程

单元测试四大过程&#xff08;蓝桥课学习笔记&#xff09; 单元测试过程 单元测试是软件测试过程中的一个关键环节&#xff0c;它与集成测试、系统测试一样&#xff0c;分为测试策划、测试设计、测试执行和测试总结几个阶段。 单元测试过程中每个阶段需要完成的主要工作如下&…

数据结构排序算法

排序也称排序算法(SortAlgorithm)&#xff0c;排序是将一组数据&#xff0c;依指定的顺序进行排列的过程。 分类 内部排序【使用内存】 指将需要处理的所有数据都加载到内部存储器中进行排序插入排序 直接插入排序希尔排序 选择排序 简单选择排序堆排序 交换排序 冒泡排序快速…

用html写文本变形动画

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文本变形动画</title><link rel"stylesheet" href"./style.css"> </head> <body> <!-- 两个文本部分…

广东莱斯广告,6.8米UV喷印推动粤东喷绘产业升级

广东莱斯广告作为汕头市大型的广告服务运营商,近日迎来了一件值得庆祝的事情:彩神6.8米UV喷印机运行一周年,销售服务商深圳嘉豪总经理李伟特地前来回访。该设备是深圳润天智数字设备股份有限公司开发的全球首台搭载XTRA6800H柯尼卡喷头的设备,设备特点是:1.色彩艳丽;2.超宽喷印…

记录flume运行时报NullPointerException异常

【背景说明】 我要起一个将kafka上的topic_log主题中的数据上传到hdfs上的flume进程。 这是我的flume配置文件脚本&#xff1a; #定义组件 a1.sourcesr1 a1.channelsc1 a1.sinksk1#配置source1 a1.sources.r1.type org.apache.flume.source.kafka.KafkaSource a1.sources.r…

《Kubernets证书篇:基于Kylin V10+ARM架构CPU修改K8S 1.26.15版本证书时间限制》

一、背景 Kubernetes 默认的证书有效期只有1年&#xff0c;因此需要每年手动更新一次节点上面的证书&#xff0c;特别麻烦而且更新过程中可能会出现问题&#xff0c;因此我们要对 Kubernetes 的 SSL 证书有效期进行修改&#xff0c;这里将证书的时间限制修改为100年。 环境信息…

112 arcpy 发布 mxd地图文件 到 arcgis服务器 为 地图服务

前言 此文档主要是记录一下 最近的一次机遇 arcpy 来发布 地图文件到 arcgis服务器 上面 arcpy 主要是来自于 ArcGIS_Desktop_105_154030.zip 安装之后会在 python 的安装目录 安装另外的一份带 arcgis 的 python 环境, 然后 本文相关类库 也是基于 这个 arcpy 的 python 环境…

web实战项目环境部署(LNMP)

环境搭建准备 1、在本机安装VMware虚拟机&#xff0c;实际工作中&#xff0c;使用的是云服务器 2、在虚拟机上安装并运行Linux系统 3、在本机上安装好远程连接工具&#xff08;xshell/FinalShell&#xff09;&#xff0c;通过远程连接工具连接到虚拟机 4、关闭linux上的防火…

深度学习之PyTorch实现卷积神经网络(CNN)

在深度学习领域&#xff0c;卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;是一种非常强大的模型&#xff0c;专门用于处理图像数据。CNN通过卷积操作和池化操作来提取图像中的特征&#xff0c;具有较好的特征学习能力&#xff0c;特别适用…

云原生:企业数字化转型的引擎与未来

一&#xff0c;引言 随着信息技术的飞速发展&#xff0c;企业数字化转型已成为时代的必然趋势。在这场深刻的变革中&#xff0c;云原生技术以其独特的优势&#xff0c;逐渐成为推动企业数字化转型的核心动力。本文将详细探讨云原生技术的内涵、发展历程&#xff0c;以及在企业数…

【Java开发指南 | 第八篇】Java变量、构造方法、创建对象

专栏&#xff1a;Java开发指南 CSDN秋说 文章目录 Java变量构造方法创建对象 Java变量 局部变量&#xff1a;在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中&#xff0c;方法结束后&#xff0c;变量就会自动销毁。成员变量&#xff08;…

研究生,该学单片机还是plc。?

PLC门槛相对较低&#xff0c;但是在深入学习和应用时&#xff0c;仍然有很高的技术要求。我这里有一套单片机入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习单片机&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&am…

OpenHarmony实战开发-图片选择和下载保存案例。

介绍 本示例介绍图片相关场景的使用&#xff1a;包含访问手机相册图片、选择预览图片并显示选择的图片到当前页面&#xff0c;下载并保存网络图片到手机相册或到指定用户目录两个场景。 效果图预览 使用说明 从主页通用场景集里选择图片选择和下载保存进入首页。分两个场景点…

Linux UDP通信系统

目录 一、socket编程接口 1、socket 常见API socket()&#xff1a;创建套接字 bind()&#xff1a;将用户设置的ip和port在内核中和我们的当前进程关联 listen() accept() 2、sockaddr结构 3、inet系列函数 二、UDP网络程序—发送消息 1、服务器udp_server.hpp initS…

stm32开发之threadx整合letter-shell 组件记录

前言 使用过rt-thread的shell 命令交互的方式&#xff0c;觉得比较方便,所以在threadx中也移植个shell的组件。这里使用的是letter-shellletter-shell 核心的逻辑在于组件通过链接文件自动初始化或自动添加的两种方式&#xff0c;方便开发源码仓库 实验(核心代码) shell 线程…