Android开发中网络相关的检测包括网络是否正常连接和网络已连接但是否可以正常访问两类。

(1)其中最常用的就是网络连接是否正常的检测,具体的代码如下:

 ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);// 获取代表联网状态的NetWorkInfo对象NetworkInfo networkInfo = connManager.getActiveNetworkInfo();if (networkInfo == null) {return false;}boolean available = networkInfo.isAvailable();if (available) {Logs.i(TAG, "当前的网络连接可用");} else {Logs.i(TAG, "当前的网络连接不可用");}return available ;

(2)对于网络已连接,但是需要判断是否可以正常访问的问题,其实我们可以使用ping的方式进行检测,经过查阅网上的资料,发现好多使用 Process process=Runtime.getRuntime().exec("/system/bin/ping -c 4 "+"www.baidu.com") 进行检测的,经过测试发现会抛IOException异常,提示相关目录也就是/system/bin/ping 这个找不见,主要原因是系统没有root,所以无法访问系统目录。因此这种方式肯定不是我们想要的,那么我们该如何实现呢?其实不要慌,我们可以采用如下这种方式就可以实现我们想要的效果

Process process=Runtime.getRuntime().exec("ping -c 1 -w 1 " + "www.baidu.com");

具体的知识及实现可参考如下:

Ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障

Ping发送一个ICMP(Internet Control Messages Protocol)即因特网信报控制协议,回声请求消息给目的地并报告是否收到所希望的ICMP echo (ICMP回声应答),用来检查网络是否通畅或者网络连接速度的命令。广义来说即发送一个数据包,根据返回的数据包得到丢包率及平均时间得出网络的连接状态。

ping命令可以用在android中检测网络ip或者socket的连接,命令格式:ping ip地址(最简)

ping具有一些参数,可以具体定义包的个数、包的最大存活时间等

-c 发送ICMP包的个数

-i 每次发送数据包中间的间隔时间,单位秒

-l <前置载入> 设置在送出要求信息之前,先行发出的数据包

-s 设置数据包的大小

-t 设置TTL(存活数值)的大小 / TTL : Time to Live该字段指定IP包被路由器丢弃之前允许通过的最大网段数量

-w deadline 数据包存活最大时间

-W timeout等待每个响应的最长时间,单位为秒

android ping检测ip地址或socket地址可使用两种方式:

一种是使用Runtime.getRuntime().exec()执行ping命令,根据方法返回值process是否连通判断连接状态

process 的 waitFor() 方法源码中的解释:

 /*** Causes the calling thread to wait for the native process associated with* this object to finish executing.** @return the exit value of the native process being waited on.* @throws InterruptedException*             if the calling thread is interrupted.*/public abstract int waitFor() throws InterruptedException;

必要的情况下,此方法会使当前线程一直处于阻塞状态直到此执行进程从结果上表现出终止。此方法会在子进程被终止的时候立即返回值。如果子进程没有被终止,则当前线程一直阻塞到子进程退出。

return:一般来说 0 表示正常停止,即正常完成,未出现异常情况。1 表示网络已连接,但是无法访问,2 表示网络未连接。

示例:


Process p = Runtime.getRuntime().exec("ping -c 1 -w 1 " + ipString);
// 读取ping的内容,可不加
InputStream input = p.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(input));
StringBuffer stringBuffer = new StringBuffer();
String content = "";
while ((content = in.readLine()) != null) {stringBuffer.append(content);
}
// PING的状态
int status = p.waitFor();
if (status == 0) {sleep(3000);
} else {isEnable = false;ExDispatcher.dispatchMessage(ExMessage.PING_CONNECT_BREAK);interrupt();
}

另一种使用ping命令中发包及包的丢失率判断通信的连接状态

Process process = Runtime.getRuntime().exec("ping "+address);
InputStreamReader r = new InputStreamReader(process.getInputStream());
LineNumberReader returnData = new LineNumberReader(r);
String returnMsg="";
String line = "";
while ((line = returnData.readLine()) != null) {  System.out.println(line);  returnMsg += line;
}  if(returnMsg.indexOf("100% loss")!=-1){  System.out.println("与 " +address +" 连接不畅通.");
}  else{  System.out.println("与 " +address +" 连接畅通.");
} 

正常的ping检测结果一般为:

====receive====:PING 192.168.43.159 (192.168.43.159) 56(84) bytes of data.

====receive====:64 bytes from 192.168.43.159: icmp_seq=1 ttl=64 time=73.8 ms

====receive====:64 bytes from 192.168.43.159: icmp_seq=2 ttl=64 time=91.4 ms

====receive====:64 bytes from 192.168.43.159: icmp_seq=3 ttl=64 time=1.18 ms

====receive====:64 bytes from 192.168.43.159: icmp_seq=4 ttl=64 time=139 ms

====receive====:--- 192.168.43.159 ping statistics ---

====receive====:4 packets transmitted, 4 received, 0% packet loss, time 3004ms

丢包率为100%时则网络为断开状态,上述结果显示发送为4个数据包,丢包率为0,连接正常

参考链接:https://blog.csdn.net/u011069604/article/details/73135531

Android 中网络连接检测和使用ping检测网络是否可访问相关推荐

  1. android ping网络连接服务器失败,Android 中网络连接检测和使用ping检测网络是否可访问...

    Android开发中网络相关的检测包括网络是否正常连接和网络已连接但是否可以正常访问两类. (1)其中最常用的就是网络连接是否正常的检测,具体的代码如下:ConnectivityManager con ...

  2. 转-Android中自动连接到指定SSID的Wi-Fi

    最近在做一个项目,其中涉及到一块"自动连接已存在的wifi热点"的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏 ...

  3. 桌面计算机网络图标不见了怎么办,网络连接图标不见了,教您网络连接图标不见了怎么办...

    随着计算机的出现,网络连接图标被赋予了新的含义,又有了新的用武之地.电脑能联网,但是电脑桌面任务栏右下角的"网络"或是"本地链接"图标却不见了,你是不是也曾遇到 ...

  4. 如何在xp添加无线网络连接服务器,xp怎么设置无线网络连接 windowsxp无线网络连接设置方法【图文】...

    电脑在我们生活中是非常常见的,并且电脑对我们生活影响也是非常的大.除此之外电脑在我们工作中所扮演的角色也是非常重要的,它的出现大大提高了我们的工作效率.而很多朋友在使用电脑的时候都会遇到很多的问题,而 ...

  5. 安卓网络连接全解:包括网络连接状态的监听、网络数据使用状态的监听、获取当前网络连接情况、启动wifi、获取当前连接wifi的网络情况、扫描wifi热点

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓网络连接情况全解:包括网络连接状态的监听.网络数据使用状态的监听.获取当前网络连接情况.启动wifi.获取当前连接wifi的网络情况.扫描wifi ...

  6. android无网络状态栏,Android中检查网络连接状态的变化,无网络时跳转到设置界面...

    在AndroidManifest.xml中加一个声明 1. 2. 3. 4. 5. NetCheckReceive.java文件如下 1.import android.content.Broadcas ...

  7. Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面

    http://www.mobiletuts.me 获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. An ...

  8. android编程获取网络和wifi状态及调用网络设置界面,Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面 - Android平台开发技术 - 博客园...

    获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...

  9. 电脑中没有显示网络连接到服务器地址,电脑没有网络可以连接到服务器地址

    电脑没有网络可以连接到服务器地址 内容精选 换一换 虚拟私有云(Virtual Private Cloud)是用户在华为云上申请的隔离的.私密的虚拟网络环境.用户可以自由配置VPC内的IP地址段.子网 ...

最新文章

  1. 上传文件到服务器指定目录,文件名相同自动替换PHP实现代码
  2. 例题3-6 环状序列(Circular Sequence, ACM/ICPC Seoul 2004, UVa1584)
  3. git分支指的是_你一定知道的Git分支模型
  4. lesson4-Qt窗口
  5. MySQL 高级- case结构
  6. 如何给Linux操作系统(CentOS 7为例)云服务器配置环境等一系列东西
  7. Crusaders Quest ZOJ - 3983 构造|思维
  8. commit git idea 速度慢_关于Git,这篇文章还不够吗?
  9. java微信服务商支付,Java 微信支付之APP支付服务端 (二)
  10. php将数组值用 分开,PHP将数组中的多个值替换为另一个数组
  11. springboot2 war页面放在那_亚马逊产品页面如何优化?这些技巧要知道
  12. Halcon 仿射变换
  13. 6.TCP/IP 详解卷1 --- ICMP:Internet 控制报文协议
  14. 年底换机潮来了,都有哪些手机受欢迎?
  15. PR第三次培训笔记(视频效果 转场)
  16. [Unity2D]实现人物动画帧的导入以及左右移动
  17. Linux 下搭建web压力测试工具web polygraph
  18. CUDA 编程学习
  19. 74cms|骑士cms|开源招聘系统,目录结构
  20. 如何快速提升教育直播间人气

热门文章

  1. windows无法连接到打印机,错误为0x0000000b,无效句柄,解决办法。
  2. YOLOv5目标检测➕声音告警
  3. c罗说什么语言,那些年属于C罗的经典语录,那一句话最感动你?
  4. Flutter杂症(couldn't find libflutter.so)
  5. 周志华-机器学习 (绪论、模型评估与选择)
  6. English学习网址
  7. API(15)——打印系统开发(52)——WinForm开发(62)——C#通过调用WinApi打印PDF文档类,服务器PDF打印、IIS PDF打印
  8. php 算生存曲线,生存曲线比较:KM法及Log Rank检验(实例+SPSS)
  9. btrace 开源!基于 Systrace 高性能 Trace 工具
  10. 完美实现笔记本在有线网卡连通时自动关闭wifi,有线网卡未连通时自动开启wifi