zoukankan      html  css  js  c++  java
  • 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.案例截图如下

    image image image image

    06.网络请求接口信息

    • 请求接口如下所示
    • General
    • 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报文模拟,可以明显提高检测速度
      • 关于代码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;
        }
        
      • 或者直接停止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

  • 相关阅读:
    1094. Car Pooling
    121. Best Time to Buy and Sell Stock
    58. Length of Last Word
    510. Inorder Successor in BST II
    198. House Robber
    57. Insert Interval
    15. 3Sum java solutions
    79. Word Search java solutions
    80. Remove Duplicates from Sorted Array II java solutions
    34. Search for a Range java solutions
  • 原文地址:https://www.cnblogs.com/yc211/p/13654046.html
Copyright © 2011-2022 走看看