android网络诊断服务(ping网络的实现,判断网络是否可用)
调用:
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网络的实现,判断网络是否可用)相关推荐
- iOS网络诊断功能 ping traceroute
最近工作中总是遇到需要排查移动客户端网络状况的情况,可能由于某些地区网络运营商的问题,导致客户端某些功能不正常,现在的做法也是非常麻烦的: 某用户反馈某一功能不能用 由运营联系到该用户 运营指导该用户 ...
- 网络诊断“您可能需要与该网络的Internet服务提供商ISP签署协议才能获得访问Internet的权限
问题描述: 当打开电脑,发现无法连接网络,使用windows的网络诊断,显示"您可能需要与该网络的Internet服务提供商ISP签署协议才能获得访问Internet的权限" 解决 ...
- 基于路由器网络诊断步骤和故障排除技巧
网络诊断是管好.用好网络,使网络发挥最大作用的重要技术工作.本文简述分层诊断技术,结合讨论路由器各种接口的诊断,综述互联网络连通性故障的排除. 网络故障诊断概述 网络故障诊断,从故障现象出发,以网络诊 ...
- 3月起这些新规将实施:从事网络招聘服务应取得许可证
2月28日消息,根据人民日报报道,2021年3月起,全国将有多项新规正式实施.这些新规将影响你我的生活. 这些新规包括,从事网络招聘服务应取得许可证.<网络招聘服务管理规定>3月1日起实施 ...
- 如何办理《网络出版服务许可证》
<网络出版服务许可证>颁布背景 <网络出版服务管理规定>已经2015年8月20日国家新闻出版广电总局局务会议通过,并经工业和信息化部同意,现予公布,自2016年3月10日起施行 ...
- springboot网络招聘服务系统毕业设计源码121727
目 录 摘要 1 绪论 1.1开发的意义及背景 1.2国内研究现状 1.3系统开发技术的特色 1.4论文结构与章节安排 2网络招聘服务系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2. ...
- Linux网络性能评估工具iperf 、CHARIOT测试网络吞吐量
目录 一. Iperf能做什么 1.TCP方面 2.UDP方面 二. Iperf的安装与使用 1.安装iperf 2.iperf参数介绍 三. Iperf应用实例 1.测试TCP吞吐量 2 . 测试U ...
- Https/Tcp抓包工具Charles、fiddler,ping (网络诊断工具),Android平台HTTPS抓包解决方案及问题分析HttpCanary
市面上已经有一些弱网络模拟工具,比如微软的Network Emulator for Windows Toolkit(NEWT),Facebook的Augmented Traffic Control(A ...
- Linux笔记 No.24---(curl、ip、nmcli、网卡/主机名/DNS配置文件、常见网络问题诊断、网络诊断工具:ping/nmap/tcpdump)
文章目录 一.curl 二.ip 三.nmcli 四.网络相关文件 (一)网络配置文件 (二)主机名配置文件 (三)DNS配置文件 五.常见网络问题诊断 六.网络诊断常用工具 (一)ping (二)n ...
- 【仙女】Android网络诊断
HttpInfo Android网络诊断工具 github传送门 Table of Contents 依赖 调用方式 网络信息 Index信息 Net信息 Ping信息 Http信息 Host信息 M ...
最新文章
- numpy 的array 用于矩阵运算 与 python的列表表示矩阵的区别
- 专访Niclas Hedhman:Apache欢迎什么样的开源项目?
- YBTOJ:伞兵空降(二分图匹配)
- 模拟服务器MockServer之Moco详细介绍
- VBS编程基础教程 (第5篇)
- linux php文件,Linux php文件安装目录在哪
- php pathseparator,在PHP拥有与命名空间和通过set_include_path()的一个问题
- java模块化发布选型_Java模块化开发
- 要走路~先要有一雙最舒適的鞋
- UVA-12661 Funny Car Racing (dijkstra)
- linux设备驱动程序第10章,linux中秒字符设备驱动(宋宝华设备驱动开发详解第10章)...
- centos安装office及PDF阅读器
- 常用颜色中英文名称及RGB数值表
- 西安航空计算机录取分数线,2019西安航空学院录取分数线及历年专业分数线统计表【文科 理科】...
- re.match()到底会返回什么?
- 街头篮球一直提示服务器维护怎么解决,街头篮球为什么进不去 街头篮球进不去怎么办...
- 扫描仪产品国家抽检实施细则及信息技术类产品检测设备
- HFSS仿真侧馈微带天线学习笔记
- JAVA 1058:求一元二次方程
- 服务器的速度没有虚拟主机快,云服务器没有虚拟主机快