Android网络收集和ping封装库

news2024/11/27 16:31:18
  • 功能
  • 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.网络请求接口信息

  • 请求接口如下所示
  • www.wanandroid.com/friend/json
  • General
  • Request URL: 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
  • 这里省略
  • 看截图如下

07.如何使用ping

  • ping的使用截图

  • 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网络工具:blog.csdn.net/fsdev/categ…

  • 关于代码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();

  • 如何取消ping

if (_netDiagnoService!=null){
_netDiagnoService.cancel(true);
_netDiagnoService = null;

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取
能够帮助到想自学提升又不知道该从何学起的朋友。**

[外链图片转存中…(img-wCPVNmOJ-1718993987603)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

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

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

相关文章

学校图书借阅管理系统(数据库课设)PS:有前端界面

1.课设要求描述 ●实现图书信息、类别、出版社等信息的管理; ●实现读者信息、借阅证信息的管理; ●实现图书的借阅、续借、归还管理; ●实现超期罚款管理、收款管理; ●创建触发器,分别实现借书和还书时自动更新图书信息的在册数量; ●创建视图查询各种图书…

谷歌手机刷机教学

注意&#xff1a;手机已经解开了oem锁和bl 1、adb基础命令 连接设备adb devices&#xff1a;列出当前连接的所有设备。 adb connect <设备IP>&#xff1a;通过IP地址连接设备&#xff08;用于无线连接&#xff09;。 设备信息adb shell getprop&#xff1a;获取设备的所…

数据结构 —— 线索二叉树

数据结构 —— 线索二叉树 线索二叉树结构定义结点类树类 线索化找线索二叉树的后继找线索二叉树的前驱 我们今天来看看线索二叉树。 线索二叉树 线索二叉树&#xff08;Threaded Binary Tree&#xff09;是一种特殊的二叉树结构&#xff0c;它是在二叉树的基础上进行改良的数…

前端 CSS 经典:旋转边框效果

效果&#xff1a; 思路&#xff1a;使用伪元素&#xff0c;给伪元素设置背景色&#xff0c;然后定位&#xff0c;遮盖&#xff0c;旋转。就可以实现旋转边框效果。 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta chars…

[FlareOn5]Ultimate Minesweeper

一切题目&#xff0c;可以运行的&#xff0c;首先就要自己运行一次 运行完毕你会发现这是个扫雷游戏 net dnspy打开 一般没有特别的 我们都是点这花括号 这有个getkey 一眼加加密 然后可以三个方向&#xff1a;动调&#xff0c;改文件&#xff0c;静态找数据写加密脚本 简…

软件工程学系统设计

一、概述 软件设计阶段用比较抽象概括的方式确定目标系统如何完成预定的任务&#xff0c;即确定系统的物理模型。 回答系统 “做什么”。 软件设计是将需求转化为最终产品的唯一途径&#xff0c;是后续开发和维护工作的基础。 1、软件设计过程 从工程管理角度&#xff0c;…

STM32通过SPI软件读写W25Q64

文章目录 1. W25Q64 2. 硬件电路 3. W25Q64框架图 4. 软件/硬件波形对比 5. 代码实现 5.1 MyI2C.c 5.2 MyI2C.h 5.3 W25Q64.c 5.4 W25Q64.h 5.5 W25Q64_Ins.h 5.6 main.c 1. W25Q64 对于SPI通信和W25Q64的详细解析可以看下面这篇文章 STM32单片机SPI通信详解-CSDN博…

手撕排序2--选择排序(直接选择+堆排序

目录&#xff1a; 1.直接选择排序 的实现及分析 2.堆排序 的实现及分析 1.直接选择排序 1.1基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完…

BP神经网络-入门到理解-长文讲述

本文来自&#xff1a;老饼讲解-BP神经网络 https://www.bbbdata.com 目录 一、BP神经网络的仿生意义 二、BP神经网络的结构 三、BP神经网络的前馈与后馈 3.1 BP神经网络的前馈 3.2 什么是BP神经网络的后馈 四、BP神经网络的训练 4.1 BP神经网络归一化 4.2 梯度下降算法…

Django使用

一、安装Django 可以在创建好的虚拟环境中下载包 pip install Django3.2.20 -i https://pypi.tuna.tsinghua.edu.cn/simple 查看对应的下载好的内容 1、在Lib的site-packages第三方包里&#xff1a;这就是django框架源码 2、在scripts中有个 这是个工具&#xff0c;帮助创建d…

vs2022 studio控制台出现中文乱码解决

vs2022 studio控制台出现中文乱码解决 问题解决 问题 这里cout中间的中文&#xff0c;但控制台出现的是乱码对此需要进行修改 解决 打开运行的主文件&#xff0c;也就是整个程序的入口&#xff0c;对他另存为 之后点击编码保存 接着将编码保存的格式变为图片对应的这种 记…

微信小程序UI组件库合集

文章目录 前言参考地址推荐组件库1.官方WeUI&#xff08;建议使用☆☆☆☆&#xff09;2.ColorUI&#xff08;广告很多&#xff0c;不建议使用&#xff09;3.vantUI又名&#xff1a;ZanUI&#xff08;操作简单&#xff0c;建议使用☆☆☆☆&#xff09;4.MinUI&#xff08;比较…

STM32通过SPI硬件读写W25Q64

文章目录 1. W25Q64 2. 硬件电路 3. 软件/硬件波形对比 4. STM32中的SPI外设 5. 代码实现 5.1 MyI2C.c 5.2 MyI2C.h 5.3 W25Q64.c 5.4 W25Q64.h 5.5 W25Q64_Ins.h 5.6 main.c 1. W25Q64 对于SPI通信和W25Q64的详细解析可以看下面这篇文章 STM32单片机SPI通信详解-C…

设计模式4-模版方法

设计模式 重构获得模式重构的关键技法1. 静态转动态2. 早绑定转晚绑定3. 继承转组合4. 编译时依赖转运行时依赖5. 紧耦合转松耦合 组件协助动机模式定义结构 要点总结。 例子示例解释&#xff1a; 重构获得模式 设计模式的目的是应对变化&#xff0c;提高复用 设计模式的要点…

昇思25天学习打卡营第3天|数据集Dataset

一、简介&#xff1a; 数据是深度学习的基础&#xff0c;高质量的数据输入将在整个深度神经网络中起到积极作用。有一种说法是模型最终训练的结果&#xff0c;10%受到算法影响&#xff0c;剩下的90%都是由训练的数据质量决定。&#xff08;doge&#xff09; MindSpore提供基于…

基于STM32的智能病房监控和人脸识别系统设计(毕业设计)

摘 要 随着技术的不断进步和医疗需求的不断增长&#xff0c;智能病房控制系统有望在医疗领域发挥更大的作用。基于此&#xff0c;本文研究设计了一款低成本、操作简单、适用性强的基于STM32的智能病房监控和人脸识别系统。该系统通过STM32作为控制器和OpenMV对人脸分辨进行门…

你好,复变函数1.0

输入时用后缀&#xff0c;开头空格 #include <easyx.h> #include <stdio.h> #define PI 3.141592653589793 #define E 2.718281828459045 #define K (1.0 / 256.0) #define K_1 256.0 //#define LINE//决定函数是用线画还是用点画 struct C {double i;double r;…

同一天里,两位大厂程序员猝死。。。

2024年&#xff0c;真的不是平静的一年。在几天前&#xff0c;IT行业接连发生了两件不幸的事情。 6月17日下午&#xff0c;东南亚电商公司Sh**ee位于北京的研发中心&#xff0c;一位负责研发的女员工突然在工位上晕倒。 同事们赶紧拨打了120&#xff0c;然而还是没能抢救过来&a…

USB2.0网卡安装驱动

有三种安装方式&#xff1a; 驱动精灵驱动总裁USB2.0网卡自带安装程序 前两种很简单&#xff0c;下载驱动精灵或者驱动总裁&#xff0c;然后检测本地硬件&#xff0c;安装相应驱动。 本文重点要介绍的是第三种&#xff0c;利用USB2.0网卡自带的安装程序。有的时候驱动精灵或…

高考志愿填报,如何避免报错专业?

高考志愿填报绝对是关键一环节&#xff0c;分数高低暂且不论&#xff0c;因为这个填报志愿&#xff0c;大概率是决定了余生的职业&#xff0c;也有人说&#xff0c;大学可以转专业&#xff0c;毕业还可以跨行就业&#xff0c;工作了还可以转行.....确实有这个可能性&#xff0c…