当前位置: 首页 > news >正文

Okhttp 浅析

安全的连接

OkHttpClient:

OkHttpClient:

1.线程调度

2.连接池,有则复用,没有就创建

3.interceptor

4.interceptor

5.监听工厂

6.是否失败重试

7.自动修正访问,如果没有权限或认证

8是否重定向  followRedirects

9.协议切换时候是否继续重定向

10.Cookie jar 容器 默认返回空的

11.本地缓存

12 dns 域名解析为dns地址

通过原生方式,根据域名获取DNS/IP地址

13.代理服务器

直连,http,Socket

14.代理的select

默认直连

15.代理授权

16.sslsocket工厂

17.x509 证书验证器,验证合法性

18.连接标准 比如版本 http 1.1 2.0

严格         -       一般              -        基本无限制

不加密传输

19.支持的协议

不加密的HTTP2

20 21 22:

证书验证相关

如果配置错误则会打印报错

多证书

23. call连接超时

24. 网络连接超时

25.读取超时

26.写入超时

27.心跳频率  websocket / http 2

enqueue 是一个接口 Call

client 通用配置等参数

Request 请求相关参数,初始的request

forwebsocket websocket 服务器主动发消息,推送数据,通过http连接

RealCall   Call接口实现类

1 跟踪程序的错误

2 监听所有事件 比如连接 断开 等

enqueue: 执行client.dispatcher.enqueue(AsyncCall xxx) 

dispatcher 线程调度用的Executor

enqueue:

尝试找到有没有当前url的主机

传入AsyncCall 添加到队列,双向队列,准备还未执行的操作

执行已经准备好的Call

取出所有的call 并且取出的值小于设定的值,添加到正在执行的call

遍历执行 executeOn,则执行runnable

executee()  = runnable,发生了线程切换

run

获取相应 getResponseWithInterceptorChain ,然后传给回调

execute: 同步执行, 直接调用getResponseWithInterceptorChain

getResponseWithInterceptorChain: 

将各种拦截器添加到集合中

创建一个拦截器的chain

链式工作

每一个都有前置后置任务

1 第一个拦截器 ,连接错误等进行重置连接

请求,然后重试

判断是哪种错误

找到一个可用连接

如果是重定向等,继续重试

成功则返回结果,否则继续重试

复制一份执行,然后调用下一个链条

2:将已经准备好的连接进行发送和过滤判断

将参数 content-length等进行填充

自动进行压缩 / 解压缩 gzip

3.缓存拦截器

有缓存直接返回

缓存类型:

没有则进行缓存

4.连接拦截器

init

coedc:编码/解码器,然后拼接成Exchange

找到可用健康的连接

先拿到可用连接

然后判断状态,最多5种方式拿到

        取消掉的

        有没有已经建立

  

          结果为空则执行,把call放到池里的连接

        多复用,判断是否可用

        

        拿到一个连接

        判断有没有超限,判断是否是同一个主机TCP端口以及加密方式和代理等配置是否相同,

       

        判断代理

        判断 http2

        判断证书

        如果已经拿到连接,直接返回,否则再进行重试

        复用已经使用过且相等地址端口证书的连接

         5次连接: 

                1有连接直接复用,

                2拿不到则在连接池取一个不多重复用的连接,

                3在拿一个多复用连接,

                4自己创建一个连接,

                5重新取池里多重复用的连接

5.往服务器发送数据拦截器

发请求,读相应

运行

读响应

 然后反式调用上一个拦截器

相关文章:

Okhttp 浅析

安全的连接 OkHttpClient: OkHttpClient: 1.线程调度 2.连接池,有则复用,没有就创建 3.interceptor 4.interceptor 5.监听工厂 6.是否失败重试 7.自动修正访问,如果没有权限或认证 8是否重定向 followRedirects 9.协议切换时候是否继续重定向 10.Cookie jar 容器 默认…...

面试常见问题:什么是进程? 什么是线程?进程和线程有什么区别?

1.什么是进程? 进程是操作系统中一个程序在执行过程中的一个实例,每个进程都有自己独立的地址空间,进程间不共享内存。它是程序运行的最小内存单元; 进程特点: 1> 需要占用独立的内存空间; 2>可以并…...

什么是SQL?

SQL和MySQL是当今计算机领域中非常重要的两个概念。SQL是关系型数据库的查询语言,而MySQL是一种关系型数据库管理系统。它们在数据存储、管理和查询方面发挥着巨大的作用。在本文中,我们将深入探讨SQL和MySQL的定义、功能、应用以及它们之间的联系。 一…...

人力资源管理后台 === 基础环境+登陆

目录 1.人力资源项目介绍 1.1 项目架构和解决方案 1.2 课程安排 1.3 课程具备能力 1.4 课程地址 2. 拉取项目基础代码 3.项目目录和入口文件介绍 4.App.vue根组件解析 5.基础设置settings.js和导航守卫permission.js 6.Vuex的结构 7.使用模板中的Icon图标 8.扩展…...

Handler系列-怎么实现delay

1.前提 前面说到sendMessage携带的delay会被加上SystemClock.uptimeMillis() ,最终赋值给Message的when。 msg.when SystemClock.uptimeMillis() delayMillis; 那么when除了用来在链表里面作为排序依据以外,还在哪里用到了呢? 2.Looper…...

C++前缀和算法的应用:最大化城市的最小供电站数目

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 二分法 题目 给你一个下标从 0 开始长度为 n 的整数数组 stations ,其中 stations[i] 表示第 i 座城市的供电站数目。 每个供电站可以在一定 范围 内给所…...

Centos/Linux安装Apahce出现bug汇总

源码安装Apache软件 使用软件:Apahce2.4.58,apr1.5.2, apr-util1.5.4 1.下载apr、apr-util和Apache软件; 2.安装apr压缩包,步骤如下: 第一、解压缩 tar zxvf apr-1.5.2.tar.gz第二、安装 cd /usr/local/sr…...

Scrapy爬虫异步框架(一篇文章齐全)

1、Scrapy框架初识 2、Scrapy框架持久化存储(点击前往查阅) 3、Scrapy框架内置管道(点击前往查阅) 4、Scrapy框架中间件(点击前往查阅) Scrapy 是一个开源的、基于Python的爬虫框架,它提供了…...

基于Hadoop架构的多重分布式BP神经网络的短期负荷预测方法

点我完整下载:基于Hadoop架构的多重分布式BP神经网络的短期负荷预测方法.docx 基于Hadoop架构的多重分布式BP神经网络的短期负荷预测方法 "A Short-term Load Forecasting Method based on Multi-distributed BP Neural Network Architecture with Hadoop Fram…...

Oracle查询数据库中当前用户每个表的数据条数

Oracle查询数据库中当前用户每个表的数据条数 select t.table_name,t.num_rows from user_tables t一般情况下这条语句就可查出想要结果 如果不行 请执行以下脚本 create or replace function count_rows(table_name in varchar2,owner in varchar2 default null)return…...

Windows从源码构建tensorflow(离线编译)

由一开始的在线编译,到后面的离线编译,一路踩坑无数,历经整整6个半小时,终于编译成功!在此记录一下参考过的文章,有时间整理一下踩坑记录。 一、环境配置 在tensorflow官网上有版本对应关系 win10 bazel …...

JMeter处理接口签名sign

写接口脚本的时候,很多接口涉及到签名,今天介绍下用JMeter编写签名脚本的方法。 举个例子,开启红包接口,请求方式为post POST /v1/api/red/open json请求参数 { "red_id":1, "timestamp":"1667033841…...

Android : Java中创建线程的几种方式_简单应用

主方法 MainTest.java package com.example.mythread;import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;public class MainTest {public static void main(String[] data){ // 以下的方…...

C# Onnx 特征匹配 DeDoDe 检测,不描述---描述,不检测

目录 介绍 效果 模型信息 项目 代码 下载 介绍 github地址:https://github.com/Parskatt/DeDoDe DeDoDe 🎶 Detect, Dont Describe - Describe, Dont Detect, for Local Feature Matching The DeDoDe detector learns to detect 3D consisten…...

第十六章 处理空字符串和 Null 值

文章目录 第十六章 处理空字符串和 Null 值空字符串和 Null 值的默认映射导出值控制空元素的形式 第十六章 处理空字符串和 Null 值 类和属性参数 XMLUSEEMPTYELEMENT XMLIGNORENULL XMLNILNOOBJECT XMLNIL 空字符串和 Null 值的默认映射 下表总结了空字符串和 null 值的…...

MYSQL 处理重复数据

文章目录 前言防止表中出现重复数据统计重复数据过滤重复数据删除重复数据在这里插入代码片后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正…...

世岩清上:未来科技展览的策展视野

面对科技未来,策展视野的核心在于把握趋势,理解人性,并充分运用科技手段提升观众的体验。以下是我对未来科技展览的策展视野。 一、以人为本的设计理念 科技发展的最终目的是服务于人类,提升人们的生活质量。因此,展…...

如何理解2023vivo开发者大会,使用Rust语言编写蓝河操作系统(BlueOS)?

在2023年vivo开发者大会上,vivo宣布使用Rust语言编写其蓝河操作系统(BlueOS)。 什么是Rust语言? Rust 是一种开放源代码系统编程语言,可用于开发高效、安全的软件。 使用 Rust 可管理内存并控制其低级详细信息。 但你…...

Android flutter this and base files have different roots

类似经历者 Android build fails with certain plugins if project is in a different drive (from sdk) 错误描述 我是windows系统,下载 flutter sdk 我是放在D盘,flutter项目是放在E盘,flutter 执行 pub get的时候,会在我C盘…...

Excel动态选择某一行/列的最后一个数据

选择列的最后一个数据&#xff1a; 以A列为例&#xff0c;使用&#xff1a; LOOKUP(1,0/(A:A<>""),A:A)选择行的最后一个数据&#xff1a; 以第3行为例&#xff0c;使用&#xff1a; LOOKUP(1,0/(3:3<>""),3:3)示例程序 列最后一个数据&a…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...