我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 使用okhttp监控网络数据

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 使用okhttp监控网络数据

这里使用Okhttp写了一个demo来监听网络请求过程中的一系列数据,包括当前网络类型、请求体、响应体大小,url,请求方式,当然还有本次核心获取域名解析时长,建立连接时长,保持连接时长,请求总时长这些数据。

一次网络请求经历了哪些过程

通过域名访问的方式来请求网络时,会经历下列过程:
1.DNS解析:通过域名服务器或者本地host将域名解析成ip地址
2.建立连接:三次握手
3.发送数据:通过GET/POST/PUT等方式将数据(header和body)发送给服务器,
4.接受数据:接受服务器返回数据:响应头和body
5.断开链接:四次挥手断开链接

OkHttp库实现了哪些网络请求过程的状态回调
在这里插入图片描述OkhttpClient的Builder类可以调用eventListener设置EventListener,EventListener会进行回调如上图的各个事件节点。

所有方法为:

public abstract class EventListener {    public void callStart(Call call) {}    // 域名解析    public void dnsStart(Call call, String domainName) {}    public void dnsEnd(Call call, String domainName, List<InetAddress> inetAddressList) {}    // 开始连接    public void connectStart(call, route.socketAddress(), proxy){}    // 释放当前Transmitter的RealConnection    public void connectionReleased(Call call, Connection connection) {}    public void connectionAcquired(call, result){};    // 请求    public void requestHeadersStart(@NotNull Call call){}    public void requestHeadersEnd(@NotNull Call call, @NotNull Request request) {}    // 响应    public void requestBodyStart(@NotNull Call call) {}    public void requestBodyEnd(@NotNull Call call, long byteCount) {}    // 结束    public void callEnd(Call call) {}    // 失败    public void callFailed(Call call, IOException ioe) {}}

流程解释:

callStart:一次请求开始了
2.dns:dns解析过程
3.connectStart: 开始建立连接了
4.secureConnect: 开始建立TSL安全链接
5.connectEnd: 链接建立结束:可能建立失败,失败后可以重试
6.requestHeaders:发送请求头
7.requestBody:发送请求body
8.responseHeaders:客户端接受响应头
9.responseBody:客户端接受响应body
10.connectionReleased:链接释放
11.callEnd:一次请求结束

添加日志拦截器获取请求体、响应体大小和响应内容:

class LoggingInterceptor : Interceptor {    private val byteCount = 1024 * 1024    @Throws(IOException::class)    override fun intercept(chain: Interceptor.Chain): Response {        //chain里面包含了request和response,按需获取        val request = chain.request()        val response = chain.proceed(request)        Log.v(HTTP, "(请求地址): ${request.url()}")        Log.v(HTTP, "请求方式: ${request.method()}")        if (request.body() == null) {            Log.v(HTTP, "(请求体大小): 0")        } else {            val requestBody = request.body()            Log.v(HTTP, "(请求体大小): ${requestBody?.contentLength()}")        }        val responseBody = response.peekBody(byteCount.toLong())        Log.v(HTTP, "(响应体大小): ${responseBody.contentLength()}")        Log.v(HTTP, "响应内容: ${responseBody.string()}")        return response    }}

自定义EventListener获取各个数据:

import android.util.Logimport com.apus.networkmonitor.constants.Tagsimport okhttp3.*import java.io.IOExceptionimport java.net.InetAddressimport java.net.InetSocketAddressimport java.net.Proxyimport java.util.concurrent.TimeUnitopen class CustomOkEventListener: EventListener() {    private var dnsStart: Long = 0 //dns开始解析时间    private var connectStart: Long = 0  //开始连接时间    private var callStart: Long = 0  //开始请求时间    private var connectAquire: Long = 0  //连接获取时间    override fun callStart(call: Call) {        Log.v(Tags.CALL, "callStart")        callStart = System.nanoTime()    }    override fun dnsStart(call: Call, domainName: String) {        Log.v(Tags.CALL, "dnsStart")        dnsStart = System.nanoTime()    }    override fun dnsEnd(call: Call, domainName: String, inetAddressList: MutableList<InetAddress>) {        Log.v(Tags.CALL, "dnsEnd")        var dnsEnd = System.nanoTime()        var duration = TimeUnit.NANOSECONDS.toMillis(dnsEnd - dnsStart)        Log.v(Tags.HTTP, "(域名解析时长): $duration ms")    }    override fun connectStart(call: Call, inetSocketAddress: InetSocketAddress, proxy: Proxy) {        Log.v(Tags.CALL, "connectStart")        connectStart = System.nanoTime()    }    override fun connectEnd(        call: Call,        inetSocketAddress: InetSocketAddress,        proxy: Proxy,        protocol: Protocol?    ) {        Log.v(Tags.CALL, "connectEnd")        connectAquire = System.nanoTime()        var duration = TimeUnit.NANOSECONDS.toMillis(connectAquire - connectStart)        Log.v(Tags.HTTP, "(建连时长): $duration ms")    }    override fun connectionAcquired(call: Call, connection: Connection) {        Log.v(Tags.CALL, "connectionAcquired")    }    override fun connectionReleased(call: Call, connection: Connection) {        Log.v(Tags.CALL, "connectionReleased")        var connectReleased = System.nanoTime()        var duration = TimeUnit.NANOSECONDS.toMillis(connectReleased - connectAquire)        Log.v(Tags.HTTP, "(连接保持时长): $duration ms")    }    override fun callEnd(call: Call) {        Log.v(Tags.CALL, "callEnd")        var callEnd = System.nanoTime()        var duration = TimeUnit.NANOSECONDS.toMillis(callEnd - callStart)        Log.v(Tags.HTTP, "(请求总时长): $duration ms")    }    override fun callFailed(call: Call, ioe: IOException) {        Log.v(Tags.CALL, "callFailed")        var callEnd = System.nanoTime()        var duration = TimeUnit.NANOSECONDS.toMillis(callEnd - callStart)        Log.v(Tags.HTTP, "(请求总时长): $duration ms")    }}

时间的计算用的是System.nanoTime(),返回正在运行的Java虚拟机的高分辨率时间源的当前值,单位为纳秒。

最后,将CustomOkEventListener设置给okhttpClient:

val builder = OkHttpClient.Builder()                .retryOnConnectionFailure(true) //失败重连                .addInterceptor(LoggingInterceptor()) //日志拦截器                .eventListener(CustomOkEventListener()) //统计请求链路各时长                builder.build()

Dns解析时长或者自定义Dns,然后设置给okhttpclient:

class CustomDns: Dns {    override fun lookup(hostname: String?): MutableList<InetAddress> {        var start = System.nanoTime()  //返回正在运行的Java虚拟机的当前值,高分辨率时间源,单位为纳秒        val lookup = Dns.SYSTEM.lookup(hostname)  //操作系统查找域名        var end = System.nanoTime()        var duration = TimeUnit.NANOSECONDS.toMillis(end - start)        Log.v(Tags.HTTP, "dns_time_l(域名解析时长): $duration " + "ms")        return lookup    }}

打印统计结果:
在这里插入图片描述

来源地址:https://blog.csdn.net/qq_24252589/article/details/131343405

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android 使用okhttp监控网络数据

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android入门之使用OKHttp组件访问网络资源

这篇文章主要为大家详细介绍了Android如何使用OKHttp组件访问网络资源功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2022-12-26

网络挑战:监控云到数据中心

随着组织扩大对基于云的资源的采用,并且分布式工作场所已成为常态,数据中心不再是企业IT的中心枢纽。互联网已成为新的企业IT中心。

使用KubeNurse进行集群网络监控

在Kubernetes中,网络是通过第三方网络插件来提供,这些三方插件本身的实现就比较复杂,以至于在排查网络问题时常常碰壁。那么有没有什么方式来监控集群中所有的网络连接呢?

Android中Retrofit+OkHttp进行HTTP网络编程的使用指南

Retrofit介绍: Retrofit(GitHub主页https://github.com/square/okhttp)和OkHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库,Retrofit简化了网络请求流程,
2022-06-06

Android使用OKHTTP解析JSON数据的实例代码

为了代码重用,我们首先封装一个类。这个类是HttpUtilHttpUtil.javapackage com.example.asus.networktest; import okhttp3.OkHttpClient;import okhtt
2023-05-31

Android中判断网络连接是否可用及监控网络状态

获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。 1)判断是
2022-06-06

Android第三方HTTP网络支持包OkHttp的基础使用教程

OkHttp 包的设计和实现的首要目标是高效。这也是选择 OkHttp 的重要理由之一。OkHttp 提供了对最新的 HTTP 协议版本 HTTP/2 和 SPDY 的支持,这使得对同一个主机发出的所有请求都可以共享相同的套接字连接。如果
2022-06-06

Centos7中怎么使用nload监控网络带宽

这篇“Centos7中怎么使用nload监控网络带宽”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Centos7中怎么使用n
2023-06-28

Linux平台下使用AdventNet ManageEngine OpUtils监控网络

要在Linux平台下使用AdventNet ManageEngine OpUtils监控网络,可以按照以下步骤进行操作:1. 下载和安装OpUtils:在ManageEngine官网下载适用于Linux的OpUtils软件包,然后按照官方提
2023-09-12

如何使用PL/SQL监控数据库

在Oracle数据库中,可以使用PL/SQL语言编写监控脚本来监控数据库的性能、状态和运行情况。以下是一些示例监控数据库的方法:监控数据库性能:编写PL/SQL脚本来查询数据库性能指标,如CPU利用率、内存使用情况、I/O操作等。可以使用D
如何使用PL/SQL监控数据库
2024-05-08

linux中如何使用iftop命令监控网络带宽

这篇文章将为大家详细讲解有关linux中如何使用iftop命令监控网络带宽,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。iftop 是网络监控工具,它提供实时带宽监控。 iftop 测量进出各个套接字连接
2023-06-16

如何监控 Linux 上进程的网络使用情况

与许多现代操作系统一样,Linux 与互联网紧密连接,有时候很难追踪哪些进程在使用您的带宽。通过使用 nethogs、lsof 和 netstat 等工具,您可以找到具有打开连接的进程。

Android网络编程,调用API获取网络数据

实现步骤: 阅读API接口使用文档使用okhttp 获取网络数据使用 gson将json数据转为数据实体类安装GsonFormatPlus插件使用glide加载网络图片 build.gradle下导入相关依赖 //数据解析
Android网络编程,调用API获取网络数据
2023-12-23

在Linux系统中怎么使用iptraf进行网络监控

这篇文章主要讲解了“在Linux系统中怎么使用iptraf进行网络监控”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Linux系统中怎么使用iptraf进行网络监控”吧!iptraf是一个
2023-06-12

Android OkHttp库简单使用和封装教程助你快速掌握网络请求技能

OkHttp是一个高效的HTTP客户端库,适用于Android和Java应用程序。它支持HTTP/2和SPDY协议,提供了同步和异步请求API、请求和响应拦截器、连接池和多路复用器、缓存支持、GZIP和DEFLATE压缩等功能,可以大大提高网络请求的性能和可扩展性
2023-05-16

Nethogs – 监控每个进程的 Linux 网络流量使用情况

NetHogs是一个开源命令行程序,用于监控 Linux 中每个进程或应用程序使用的实时网络流量带宽。NetHogs 是一个小型网络工具。

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录