Android 使用okhttp监控网络数据

这篇具有很好参考价值的文章主要介绍了Android 使用okhttp监控网络数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

OkHttp库实现了哪些网络请求过程的状态回调
android 监听网络请求,Android,okhttp,网络,androidOkhttpClient的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) {}
}

流程解释:

1.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.Log
import com.apus.networkmonitor.constants.Tags
import okhttp3.*
import java.io.IOException
import java.net.InetAddress
import java.net.InetSocketAddress
import java.net.Proxy
import java.util.concurrent.TimeUnit

/**
 * @author: libo
 * @date: 2023/4/26 09:38
 * @Description: 监听okhttp请求,包括连接总时长和请求总时长
 */
open 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
    }
}

打印统计结果:
android 监听网络请求,Android,okhttp,网络,android文章来源地址https://www.toymoban.com/news/detail-668394.html

到了这里,关于Android 使用okhttp监控网络数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Android]网络框架之OkHttp(详细)(kotlin)

    目录 OkHttp的介绍 添加依赖 OkHttp的使用 get的同步与异步请求 post的同步与异步请求 POST请求的数据格式 POST请求上传文件 POST请求上传json对象 POST请求上传多个数据 OkHttp的配置 1.Builder构建器 2.自定义拦截器 3.自定义缓存 4. 自定义Cookie https://square.github.io/okhttp/ 由Square公司贡献的

    2024年02月12日
    浏览(84)
  • Android低版本(4.4)okhttp 网络适配

    目录 访问网络时,出现错误: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xb7eabc88: Failure in SSL library, usually a protocol error    error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version (external/openssl/ssl/s23_clnt.c:741 0xa4fb8d5c:0x00000000) SSLSocket的setEnabledProtocols配置支持TLSv1.1,

    2024年01月17日
    浏览(39)
  • 实现Android中的网络请求和数据解析

    在Android中,可以使用以下方法进行网络请求和数据解析: 网络请求 使用Android框架提供的HttpURLConnection或HttpClient进行网络请求。 1.1 HttpUrlConnection HttpURLConnection是一个轻量级的HTTP客户端,它允许您在Android应用程序中发送HTTP请求和接收HTTP响应。以下是一个示例: 1.2 HttpClient

    2024年02月10日
    浏览(37)
  • Android OKhttp使用(下载和上传文件)

    首先在build.gradle中引入okhttp 下面是demo(用okthttp下载网络上的资源) 用okthttp将资源上传至网络

    2024年02月11日
    浏览(51)
  • android—ktor-client封装使用,请求网络

    ktor-client封装使用步骤: 1.导入依赖: 设置版本号: 添加依赖: 2.封装网络工具类: 3.进行请求: PS: 网络请求需要放在协程里面使用

    2024年02月13日
    浏览(44)
  • 【Android】OkHttp+Retrofit+Flow的简单使用

    实现一个简单的登录功能 引入依赖 我们现在有这样一个 Body 请求参数 当使用 post 请求之后,获取返回的数据 当允许登录的话,这个值就是 true 我们先创建两个数据Bean类 然后我们再创建一个密封类处理返回结果的分类 我们再创建一个Retrofit+OkHttp的单例类 好了,接下来再创

    2024年02月12日
    浏览(43)
  • Android 监听网络状态变化

    此篇存在的主要意义在于解决用户使用app中网络状态发生了变化,需要我们去动态监听网络连接状态(有网、无网)、网络类型 (包括wifi、移动网络 - 3G、4G等等) 门前授课 关于网络状态的监听,主要是基于 Android 广播 - BroadcaseReceiver组件 ~ 同时关于广播的注册方面,从An

    2024年02月10日
    浏览(50)
  • android开发使用OkHttp自带的WebSocket实现IM功能

    目录 一、背景 二、在项目中添加依赖包 三、框架调用 1、配置OkHttpClient  2、调用Url,构建WebSocket请求 3、建立连接 4、使用WebSocket对象发送消息     android app开发经常会有IM需求,很多新手不晓得如何入手,难点在于通讯不中断。其实android发展到今天,很多技术都很完善,有

    2024年02月08日
    浏览(40)
  • Android中okhttp的websocket的详细使用方法(加断线重连)

    介绍之类的就不多讲了,懒得讲也未必有别人整理的清晰,直接上代码 使用:

    2024年02月15日
    浏览(35)
  • Android Studio中App Inspection 或Profiler里网络请求数据显示中文乱码解决办法

    效果如下: 解决办法 Android studio在 Help中找到Edit Custom VM Options… 并打开文件,在文件中添加 最后重启AS可解决

    2024年02月12日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包