Android网络收集和ping封装库
时间:2022-07-24
本文章向大家介绍Android网络收集和ping封装库,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
目录介绍
- 01.基础介绍
- 02.stetho大概流程
- 03.Android中应用
- 04.如何使用
- 05.案例截图如下
- 06.网络请求接口信息
- 07.如何使用ping
01.基础介绍
- 该工具作用
- 诸葛书网络拦截分析,主要是分析网络流量损耗,以及request,respond过程时间。打造网络分析工具……
- 参考stetho库地址
- 功能
- Stetho 是 Facebook 开源的一个 Android 调试工具。
- 是一个 Chrome Developer Tools 的扩展,可用来检测应用的网络、数据库、WebKit 、SharePreference等方面的功能。
- 开发者也可通过它的 dumpapp 工具提供强大的命令行接口来访问应用内部。
02.stetho大概流程
- 用语言来描述应该是这样子:
- 1、安装了stetho插件的app启动之后,会启动一个本地server1(LocalSocketServer),这个本地server1等待着app(client)的连接。
- 2、同时,这个本地server1会与另外一个本地server2(ChromeDevtoolsServer)连接着。
- 3、本地app一旦连接上,数据将会不停的被发送到本地server1,然后转由server2.
- 4、然后Chrome Developer Tools,想访问网站一样的,访问了ChromeDevtoolsServer,随之将数据友好的展示给了开发者,这么一个过程就此完结。
- 整个网络请求主要分为几个步骤,而整个请求的耗时可以细分到每一个步骤里面。
- DNS 解析。通过 DNS 服务器,拿到对应域名的 IP 地址。在这个步骤,比较关注 DNS 解析耗时情况、运营商 LocalDNS 的劫持、DNS 调度这些问题。
- 创建连接。跟服务器建立连接,这里包括 TCP 三次握手、TLS 密钥协商等工作。多个 IP/ 端口该如何选择、是否要使用 HTTPS、能否可以减少甚至省下创建连接的时间。
- 发送 / 接收数据。在成功建立连接之后,就可以愉快地跟服务器交互,进行组装数据、发送数据、接收数据、解析数据。思考一下,如何根据网络状况将带宽利用好,怎么样快速地侦测到网络延时,在弱网络下如何调整包大小等问题。
- 关闭连接。连接的关闭看起来非常简单
03.Android中应用
- 应用代码如下所示new OkHttpClient.Builder() .addNetworkInterceptor(new StethoInterceptor()) .build()
- 那么既然网络请求添加StethoInterceptor,既可以拦截网络请求和响应信息,发送给Chrome。那么能不能自己拿来用……
- 可以的
- StethoInterceptor大概流程
- 整个流程我们可以简化为:发送请求时,给Chrome发了条消息,收到请求时,再给Chrome发条消息(具体怎么发的可以看NetworkEventReporterImpl的实现)
- 两条消息通过EventID联系起来,它们的类型分别是OkHttpInspectorRequest 和 OkHttpInspectorResponse,两者分别继承自NetworkEventReporter.InspectorRequest和NetworkEventReporter.InspectorResponse。
- 我们只要也继承自这两个类,在自己的网络库发送和收到请求时,构造一个Request和Response并发送给Chrome即可。
- 如何拿来用
- 既然Android中使用到facebook的stetho库,可以拦截手机请求请求,然后去Chrome浏览器,在浏览器地址栏输入:chrome://inspect 。即可查看请求信息。
- 那么能不能把这个拿到的请求信息,放到集合中,然后在Android的页面中展示呢?这样方便开发和测试查看网络请求信息,以及请求流程中的消耗时间(比如dns解析时间,请求时间,响应时间,共耗时等等)
- 如何消耗记录时间
- 在OkHttp库中有一个EventListener类。该类是网络事件的侦听器。扩展这个类以监视应用程序的HTTP调用的数量、大小和持续时间。
- 所有启动/连接/获取事件最终将接收到匹配的结束/释放事件,要么成功(非空参数),要么失败(非空可抛出)。
- 比如,可以在开始链接记录时间;dns开始,结束等方法解析记录时间,可以计算dns的解析时间。
- 比如,可以在开始请求记录时间,记录connectStart,connectEnd等方法时间,则可以计算出connect连接时间。
04.如何使用
- 如下所示new OkHttpClient.Builder() //配置工厂监听器。主要是计算网络过程消耗时间 .eventListenerFactory(NetworkListener.get()) //主要是处理拦截请求,响应等信息 .addNetworkInterceptor(new StethoInterceptor()) .build()
- 该库目的
- 做成悬浮全局按钮,点击按钮可以查看该activity页面请求接口,可以查看请求几个接口,以及接口请求到响应消耗流量
- 方便查看网络请求流程,比如dns解析时间,请求时间,响应时间
- 方便测试查看请求数据,方便抓包。可以复制request,respond,body等内容。也可以截图
- 待完善功能
- 添加ping功能,通过ping检测网络问题,帮助诊断
- 需要弄一个悬浮按钮,即添加跳转网路拦截list入口
- 网络请求响应超过1秒后(也可能是2秒),需要给提示,便于那种网络超时
05.案例截图如下
06.网络请求接口信息
- 请求接口如下所示
- General
- Request URL: https://www.wanandroid.com/friend/json
- Request Method: GET
- Status Code: 200 OK
- Remote Address: 47.104.74.169:443
- Referrer Policy: no-referrer-when-downgrade
- Response Header
- HTTP/1.1 200 OK
- Server: Apache-Coyote/1.1
- Cache-Control: private
- Expires: Thu, 01 Jan 1970 08:00:00 CST
- Content-Type: application/json;charset=UTF-8
- Transfer-Encoding: chunked
- Date: Thu, 10 Sep 2020 01:05:47 GMT
- Request Header
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
- Accept-Encoding: gzip, deflate, br
- Accept-Language: zh-CN,zh;q=0.9
- Cache-Control: no-cache
- Connection: keep-alive
- Cookie: JSESSIONID=5D6302E64E9734210FA231A6FAF5799E; Hm_lvt_90501e13a75bb5eb3d067166e8d2cad8=1598920692,1599007288,1599094016,1599629553; Hm_lpvt_90501e13a75bb5eb3d067166e8d2cad8=1599699419
- Host: www.wanandroid.com
- Pragma: no-cache
- Sec-Fetch-Dest: document
- Sec-Fetch-Mode: navigate
- Sec-Fetch-Site: none
- Upgrade-Insecure-Requests: 1
- User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
- Response返回body
- 这里省略
- 看截图如下
image
07.如何使用ping
- ping的使用截图
image
- ping是一个工具
- Ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。
- 利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。
- Ping发送一个ICMP(Internet Control Messages Protocol)即因特网信报控制协议,回声请求消息给目的地并报告是否收到所希望的ICMP echo (ICMP回声应答),用来检查网络是否通畅或者网络连接速度的命令。广义来说即发送一个数据包,根据返回的数据包得到丢包率及平均时间得出网络的连接状态。
- ping的作用有哪些
- 我们可能都会遇到网站打不开,当出现不开的时候,我们也不知道是那里出了问题,不知道是不是解析出了问题还是网站的空间出了问题,这时候我们就可以通过ping来查找问题,看看网站能不能ping的通。
- ping在Android的应用
- 为了检查网络,在android上也可以通过ping来查看是否网络通。
- 实现方案有哪些
- 通过后台线程执行ping命令的方式模拟traceroute的过程,缺点就是模拟过程较慢,timeout的出现比较频繁
- 通过编译开源网络检测库iputilsC代码的方式对traceroute进行了套接字发送ICMP报文模拟,可以明显提高检测速度
- 深入理解iputils网络工具:https://blog.csdn.net/fsdev/category_1212445.html
- 关于代码ping的过程信息
- 开启一个AsyncTask,在doInBackground方法中开始解析,这个是入口。
- 添加头部信息,主要包括:开始诊断 + 输出关于应用、机器、网络诊断的基本信息 + 输出本地网络环境信息
- tcp三次握手操作
- 开始执行链接,这里有两个重要信息。一个是ip集合,另一个是InetAddress数组,遍历【长度是ip集合length】,然后执行请求
- 创建socketAddress,有两个参数,一个是ip,一个是端口号80,然后for循环执行socket请求
- 在执行socket请求的时候,如果有监听到超时SocketTimeoutException异常则记录数据,如果有异常则记录数据
- 当出现发生timeOut,则尝试加长连接时间,注意连续两次连接超时,停止后续测试。连续两次出现IO异常,停止后续测试
- 当然只要有一次完整执行成功的流程,那么则记录三次握手操作成功
- 诊断ping信息, 同步过程。这个主要是直接通过ping命令监测网络
- 创建一个NetPing对象,设置每次ping发送数据包的个数为4个
- 然后ping本机ip地址,ping本地网观ip地址,ping本地dns。这个ping的指令是啥?这个主要是用java中的Runtime执行指令……
- 开始诊断traceRoute
- 先调用原生jni代码,调用jni c函数执行traceroute过程。如果发生了异常,再调用java代码执行操作……
- 然后通过ping命令模拟执行traceroute的过程,比如:ping -c 1 -t 1 www.jianshu.com
- 如果成功获得trace:IP,则再次发送ping命令获取ping的时间
- 在该项目中如何使用ping
- 直接创建一个ping,需要传递一个网址url_netDiagnoService = new NetDiagnoService(getContext(), getContext().getPackageName() , versionName, userId, deviceId, host, this); _netDiagnoService.execute();
- 如何取消pingif (_netDiagnoService!=null){ _netDiagnoService.cancel(true); _netDiagnoService = null; }
- 或者直接停止ping。停止线程允许,并把对象设置成null_netDiagnoService.stopNetDialogsis();
- 关于监听/** * 诊断结束,输出全部日志记录 * @param log log日志输出 */ @Override public void OnNetDiagnoFinished(String log) { setText(log); }
/**
* 监控网络诊断过程中的日志输出
* @param log log日志输出
*/
@Override
public void OnNetDiagnoUpdated(String log) {
showInfo += log;
setText(showInfo);
}
```
该库地址:https://github.com/yangchong211/YCAndroidTool
- 双机热备工作模式及高内聚低耦合架构解释
- linux下拷贝命令中的文件过滤操作记录
- 关于智慧城市的十大反思(上)
- scrollTop与offsetTop研究
- JQuery笔记(四) 通用选择的尝试
- Docker容器学习梳理--基础环境安装
- Javascript:模仿淘宝的信用评价
- 好米有好价! 两枚4字母域名均以五位数交易
- Docker容器学习梳理--Volume数据卷使用
- 菜单常用:复位全部并设置某个项的样式
- Mysql更换MyISAM存储引擎为Innodb的操作记录
- 比特币分叉倒计时,糖果福利又来了
- 执行git push出现"Everything up-to-date"
- linux下EOF写法梳理
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【React+Typescript+Antd】页面内局部路由跳转
- 第1天:网易2018年校园招聘NLP算法工程师笔试试卷分析
- 【React+Typescript+Antd】全局路由跳转
- 【React+Typescript+Antd】防止样式感染——LESS CSS 框架简介
- 【React+Typescript+Antd】界面框架布局——Layout布局+ Grid栅格
- SpringBoot源码学习(三)
- Axure RP 9 安装与中文汉化
- Linux 离线安装docker的过程
- Mac环境变量设置(以ADB为例)
- Linux 基础之定时任务
- Git库迁移步骤(从服务器A迁移至服务器B)
- springboot源码解析(四)
- 第2天:网易2018年校园招聘NLP算法工程师笔试试卷分析(二)
- Windows下Scoop安装、配置与使用
- Flutter免费iOS真机调试 AndroidStudio iPhone真机运行教程