调用:

NetPingManager netPingManager = new NetPingManager(mContext, "www.baidu.com", new NetPingManager.IOnNetPingListener() {@Overridepublic void ontDelay(long log) {//todo 延迟ms}@Overridepublic void onError() {//错误,网络不通}
});
netPingManager.startGetDelay();

NetPingManager 全部代码:

package tv.buka.roomSdk.util;import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 网络诊断服务 通过对指定域名进行ping* <p>* Created by hwk on 2018/7/6.*/
public class NetPingManager {private String mDomain; // 接口域名private InetAddress[] mAddress;private List<String> mAddressIpList;private IOnNetPingListener mIOnNetPingListener; // 将监控日志上报到前段页面private HandlerThread mHandlerThread;private static int DELAY_TIME = 1000;private ConnectivityManager manager;private final Handler mHandleMessage;/*** 延迟*/public void setDuration(int delay) {DELAY_TIME = delay;}/*** 初始化网络诊断服务*/public NetPingManager(Context context, String domain, IOnNetPingListener theListener) {this.mDomain = domain;this.mIOnNetPingListener = theListener;this.mAddressIpList = new ArrayList<>();if (null != context)this.manager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);this.mHandlerThread = new HandlerThread("ping");this.mHandlerThread.start();this.mHandleMessage = new Handler(mHandlerThread.getLooper()) {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 0://每次请求清空上传集合if (null != mAddressIpList)mAddressIpList.clear();startNetDiagnosis();if (null != mHandlerThread)mHandleMessage.sendEmptyMessageDelayed(0, DELAY_TIME);break;}}};}/*** 开始监听*/public void startGetDelay() {if (null != this.mHandleMessage) {this.mHandleMessage.sendEmptyMessage(0);}}/*** 释放*/public void release() {synchronized (NetPingManager.class) {if (null != this.manager)this.manager = null;if (null != this.mHandleMessage) {this.mHandleMessage.removeMessages(0);}if (null != mHandlerThread) {Looper looper = this.mHandlerThread.getLooper();if (looper != null) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {looper.quitSafely();} else {looper.quit();}}}this.mHandlerThread = null;this.mIOnNetPingListener = null;if (null != mAddressIpList)mAddressIpList.clear();this.mAddressIpList = null;this.manager = null;}}/*** 监控网络诊断的跟踪信息*/public interface IOnNetPingListener {void ontDelay(long log);void onError();}/*** 开始诊断网络*/private void startNetDiagnosis() {if (!TextUtils.isEmpty(this.mDomain)) {// 网络状态if (isNetworkConnected()) {parseDomain(this.mDomain);// 域名解析// TCP三次握手时间测试execUseJava();} else {if (null != mIOnNetPingListener) {mIOnNetPingListener.onError();}
//                Log.e("tag", "当前主机未联网,请检查网络!");}}}/*** 使用java执行connected*/private boolean execUseJava() {if (mAddress != null && mAddressIpList != null) {int len = mAddress.length;if (len > 1) {execIP(mAddress[0], mAddressIpList.get(0));}}return false;}private static final int PORT = 80;private static final int CONN_TIMES = 4;// 设置每次连接的timeout时间private int TIME_OUT = 6000;private final long[] RttTimes = new long[CONN_TIMES];// 用于存储三次测试中每次的RTT值/*** 返回某个IP进行5次connect的最终结果*/private boolean execIP(InetAddress inetAddress, String ip) {boolean isConnected = true;InetSocketAddress socketAddress;if (inetAddress != null && ip != null) {socketAddress = new InetSocketAddress(inetAddress, PORT);int flag = 0;for (int i = 0; i < CONN_TIMES; i++) {execSocket(socketAddress, i);if (RttTimes[i] == -1) {// 一旦发生timeOut,则尝试加长连接时间TIME_OUT += 4000;if (i > 0 && RttTimes[i - 1] == -1) {// 连续两次连接超时,停止后续测试flag = -1;break;}} else if (RttTimes[i] == -2) {if (i > 0 && RttTimes[i - 1] == -2) {// 连续两次出现IO异常,停止后续测试flag = -2;break;}}}long time = 0;int count = 0;if (flag == -1) {isConnected = false;} else if (flag == -2) {isConnected = false;} else {for (int i = 0; i < CONN_TIMES; i++) {if (RttTimes[i] > 0) {time += RttTimes[i];count++;}}if (count > 0) {if (mIOnNetPingListener != null)mIOnNetPingListener.ontDelay(time / count);}}} else {isConnected = false;}return isConnected;}/*** 针对某个IP第index次connect*/private void execSocket(InetSocketAddress socketAddress, int index) {long start;long end;Socket mSocket = new Socket();try {start = System.currentTimeMillis();mSocket.connect(socketAddress, TIME_OUT);end = System.currentTimeMillis();RttTimes[index] = end - start;} catch (SocketTimeoutException e) {RttTimes[index] = -1;// 作为TIMEOUT标识e.printStackTrace();} catch (IOException e) {RttTimes[index] = -2;// 作为IO异常标识e.printStackTrace();} finally {if (mSocket != null) {try {mSocket.close();} catch (IOException io) {io.printStackTrace();}}}}/*** 判断网络是否连接*/private Boolean isNetworkConnected() {if (manager == null) {return false;}try {NetworkInfo networkinfo = manager.getActiveNetworkInfo();return !(networkinfo == null || !networkinfo.isAvailable());} catch (Exception e) {e.printStackTrace();return false;}}/*** 域名解析*/private boolean parseDomain(String domain) {boolean flag = false;Map<String, Object> map = getDomainIp(domain);String useTime = (String) map.get("useTime");mAddress = (InetAddress[]) map.get("remoteInet");if (mAddress != null) {// 解析正确mAddressIpList.add(mAddress[0].getHostAddress());flag = true;} else {// 解析不到,判断第一次解析耗时,如果大于10s进行第二次解析if (Integer.parseInt(useTime) > 10000) {map = getDomainIp(domain);mAddress = (InetAddress[]) map.get("remoteInet");if (mAddress != null) {mAddressIpList.add(mAddress[0].getHostAddress());flag = true;}}}return flag;}/*** 解析IP*/private Map<String, Object> getDomainIp(String domain) {Map<String, Object> map = new HashMap<>();long start = 0;long end;String time = null;InetAddress[] remoteInet = null;try {start = System.currentTimeMillis();remoteInet = InetAddress.getAllByName(domain);if (remoteInet != null) {end = System.currentTimeMillis();time = (end - start) + "";}} catch (UnknownHostException e) {end = System.currentTimeMillis();time = (end - start) + "";remoteInet = null;e.printStackTrace();} finally {map.put("remoteInet", remoteInet);map.put("useTime", time);}return map;}
}

android网络诊断服务(ping网络的实现,判断网络是否可用)相关推荐

  1. iOS网络诊断功能 ping traceroute

    最近工作中总是遇到需要排查移动客户端网络状况的情况,可能由于某些地区网络运营商的问题,导致客户端某些功能不正常,现在的做法也是非常麻烦的: 某用户反馈某一功能不能用 由运营联系到该用户 运营指导该用户 ...

  2. 网络诊断“您可能需要与该网络的Internet服务提供商ISP签署协议才能获得访问Internet的权限

    问题描述: 当打开电脑,发现无法连接网络,使用windows的网络诊断,显示"您可能需要与该网络的Internet服务提供商ISP签署协议才能获得访问Internet的权限" 解决 ...

  3. 基于路由器网络诊断步骤和故障排除技巧

    网络诊断是管好.用好网络,使网络发挥最大作用的重要技术工作.本文简述分层诊断技术,结合讨论路由器各种接口的诊断,综述互联网络连通性故障的排除. 网络故障诊断概述 网络故障诊断,从故障现象出发,以网络诊 ...

  4. 3月起这些新规将实施:从事网络招聘服务应取得许可证

    2月28日消息,根据人民日报报道,2021年3月起,全国将有多项新规正式实施.这些新规将影响你我的生活. 这些新规包括,从事网络招聘服务应取得许可证.<网络招聘服务管理规定>3月1日起实施 ...

  5. 如何办理《网络出版服务许可证》

    <网络出版服务许可证>颁布背景 <网络出版服务管理规定>已经2015年8月20日国家新闻出版广电总局局务会议通过,并经工业和信息化部同意,现予公布,自2016年3月10日起施行 ...

  6. springboot网络招聘服务系统毕业设计源码121727

    目  录 摘要 1 绪论 1.1开发的意义及背景 1.2国内研究现状 1.3系统开发技术的特色 1.4论文结构与章节安排 2网络招聘服务系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2. ...

  7. Linux网络性能评估工具iperf 、CHARIOT测试网络吞吐量

    目录 一. Iperf能做什么 1.TCP方面 2.UDP方面 二. Iperf的安装与使用 1.安装iperf 2.iperf参数介绍 三. Iperf应用实例 1.测试TCP吞吐量 2 . 测试U ...

  8. Https/Tcp抓包工具Charles、fiddler,ping (网络诊断工具),Android平台HTTPS抓包解决方案及问题分析HttpCanary

    市面上已经有一些弱网络模拟工具,比如微软的Network Emulator for Windows Toolkit(NEWT),Facebook的Augmented Traffic Control(A ...

  9. Linux笔记 No.24---(curl、ip、nmcli、网卡/主机名/DNS配置文件、常见网络问题诊断、网络诊断工具:ping/nmap/tcpdump)

    文章目录 一.curl 二.ip 三.nmcli 四.网络相关文件 (一)网络配置文件 (二)主机名配置文件 (三)DNS配置文件 五.常见网络问题诊断 六.网络诊断常用工具 (一)ping (二)n ...

  10. 【仙女】Android网络诊断

    HttpInfo Android网络诊断工具 github传送门 Table of Contents 依赖 调用方式 网络信息 Index信息 Net信息 Ping信息 Http信息 Host信息 M ...

最新文章

  1. numpy 的array 用于矩阵运算 与 python的列表表示矩阵的区别
  2. 专访Niclas Hedhman:Apache欢迎什么样的开源项目?
  3. YBTOJ:伞兵空降(二分图匹配)
  4. 模拟服务器MockServer之Moco详细介绍
  5. VBS编程基础教程 (第5篇)
  6. linux php文件,Linux php文件安装目录在哪
  7. php pathseparator,在PHP拥有与命名空间和通过set_include_path()的一个问题
  8. java模块化发布选型_Java模块化开发
  9. 要走路~先要有一雙最舒適的鞋
  10. UVA-12661 Funny Car Racing (dijkstra)
  11. linux设备驱动程序第10章,linux中秒字符设备驱动(宋宝华设备驱动开发详解第10章)...
  12. centos安装office及PDF阅读器
  13. 常用颜色中英文名称及RGB数值表
  14. 西安航空计算机录取分数线,2019西安航空学院录取分数线及历年专业分数线统计表【文科 理科】...
  15. re.match()到底会返回什么?
  16. 街头篮球一直提示服务器维护怎么解决,街头篮球为什么进不去 街头篮球进不去怎么办...
  17. 扫描仪产品国家抽检实施细则及信息技术类产品检测设备
  18. HFSS仿真侧馈微带天线学习笔记
  19. JAVA 1058:求一元二次方程
  20. 服务器的速度没有虚拟主机快,云服务器没有虚拟主机快

热门文章

  1. 文件下载中使用inputStream流获取文件大小
  2. vue element-ui el-form表单验证表单验证,数值输入验证踩坑
  3. 全网最详细教程整理,Python自动化操作PPT总结归纳
  4. 深入了解ElasticSearch的Nested数据类型
  5. 漏洞优先级技术(VPT)导论
  6. 华为手机手机与计算机传输,华为手机怎么和电脑进行互联传输文件
  7. vm12装xp系统步骤
  8. a轮b轮c轮天使轮区别是什么?
  9. 微型计算机硬盘接口种类,各种类型的固态硬盘接口形态分类
  10. 分布式事务中的时间戳详解