编程技术文章分享与教程

网站首页 > 技术文章 正文

网络相关面试题 网络相关面试问题

hmc789 2024-11-13 11:33:18 技术文章 5 ℃

目录

一.基础网络相关

1.http、https、tcp、udp、socket介绍?

2.http返回的常见状态码?

3. 说一下 HTTP 协议请求头我们常用的 3 个字段?

4.讲讲 HTTPS 是如何做加密的,说下非对称加密算法 。

5.TCP和UDP的区别

6.OSI与TCP/IP各层的结构与功能,都有哪些协议

7.TCP的三次握手过程?为什么会采用三次握手,若采用二次握手可以吗?

8.Http协议位于TCP/IP模型的第几层?为什么说Http协议是可靠的数据传输协议?

9.HTTP协议的结构?

10.HTTP怎么处理长连接?

11.http协议版本有几种,它们分别有什么区别?

12.http get与post方法在项目中如何选择,有何区别

13.HTTP HTTPS的区别?

14.HttpClient与HttpUrlConnection的区别

15.Socket建立网络连接的步骤

16.HTTP请求的完整过程?

17.浏览器输入地址到返回结果发生了什么

18.Cookie与Session的作用于原理?

19.网络劫持的类型原理

20.多线程断点续传的步骤?

21.从网络加载一个10MB的图片,要注意什么?

22.有没有抓过包?网络抓包原理?

二.网络框架相关内容

1.谈一谈你对Volley的理解?

2.HttpUrlConnection和HttpClient的区别?

3.怎么使用OkHttp的拦截器?

4.OkHttp有哪些拦截器?

5.通过比较Volley、OkHttp和Retrofit来说说他们的区别?

6.OkHttp中使用了哪些设计模式?

7.OkHttp可以设置哪些超时?

8.Retrofit中怎么使用的动态代理,有什么好处?

9.如何自定义一个网络请求框架?

一.基础网络相关

1.http、https、tcp、udp、socket介绍?

http是超文本传输协议,明文信息传输;https是安全超文本传输,具有ssl加密性。

http和https使用的是连接方式不同,端口号也不一样,http是80,https是443.

http连接很简单,是无状态的;https协议是有ssl+http协议构建的可进行加密传输、需要身份认证的网络协议,比http协议安全,并且数据完整性。

TCP:传送控制协议

udp:用户数据包协议

tcp、udp属于运输层

socket:俗称套接字;不属于协议范围内,只用通过socket才能使用tcp与ip协议,socket本身不是协议,而是一个调用接口api,socket是用来实现tcp/udp连接的

http是基于tcp的,用socket可以创建tcp连接,也可以创建udp连接。意味着,用socket可以创建任何协议的连接,因为其他协议都是基于它。


2.http返回的常见状态码?

200 OK:表示请求在服务端被正常处理了,客户端请求成功。

204 No Content:表示服务端接受的请求已经正常处理,但是返回的响应报文中不会返回响应实体部分。

206 Partial Content:表示客户端进行了范围请求,而服务端成功执行了这部分GET请求。响应报文内包含由Content-Range指定范围的实体内容。(用于断点续传)

301 Moved Permanent:永久重定向,表示请求的资源已经分配了新的URI(永久的),以后请求资源请请求新的URL。

302 Found:临时重定向,表示请求的资源已经分配了新的URI(临时的),以后请求资源请请求新的URL。(没有规定是否需要用GET方法重定向)

303 See Other:临时重定向,表示请求的资源已经分配新的URI,应该使用Get方法重新获取请求资源。

304 Not Modified:客户端进行条件请求验证,资源未改变则返回304,主要用于协商缓存机制中的本地缓存是否可以使用。

307 Temporary Redirect:临时重定向,与303的区别是不会强制客户端使用Get方法重定向,而是遵循浏览器本身。

308 Permanent Redirect:永久重定向,308 的定义实际上和 301 是一致的,唯一的区别在于,308 状态码不允许浏览器将原本为 POST 的请求重定向到 GET 请求上。

400 Bad Request:客户端请求语法错误,服务器无法解析。

401 Unauthorized:第一次收到401状态码表示需要进行用户登录认证,第二次收到401状态码表示认证失败。

403 Forbidden:服务器拒绝了客户端的请求。一般访问授权、访问权限出错了就会返回403。

404 Not Found:请求资源不存在。

500 Internal Server Error:服务端在执行请求的时候发生错误。

503 Server Unavailable:表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

C++音视频开发学习资料:点击领取→音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

3. 说一下 HTTP 协议请求头我们常用的 3 个字段?

常见请求头:

Accept:text/html、image/*(客户端可接受的类型)

Accept-Charset:ISO-8859-1(客户端可接受的编码类型)

Accept-Encoding:gzip、compress(客户端可接受的压缩编码类型)

Accept-Language:en-us、zh-cn(客户端可接受的语言与国家)

Host: IT315(客户端的请求主机和端口)

If-Modified-Since:Tue, 11 Jul 2000 18:23:51 GMT(客户端缓存时间,只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。)

User-Agent:Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)(客户端相关信息,如果请求经过代理也可能会添加代理服务器的信息)

Cookie:客户端暂存服务端的相关信息

Connection: close(1.0)/Keep-Alive(1.1)(HTTP请求的版本特点)

Date: Tue, 11 Jul 2000 18:23:51 GMT(请求网站的时间)

常见响应头:

Server:apache tomcat(服务器的类型)

Content-Encoding: gzip(服务器发送的压缩编码方式)

Content-Length: 80(服务器发送显示的字节码长度)

Content-Language: zh-cn(服务器发送内容的语言和国家名)

Content-Type: image/jpeg; charset=UTF-8(服务器发送内容的类型和编码类型)

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(服务器最后一次修改的时间)

Refresh: 1;url=http://www.it315.org(控制客户端1秒钟后转发URL所指向的页面)

Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服务器发送Cookie相关的信息) Expires: -1(服务器控制浏览器不要缓存网页,默认是缓存)

Cache-control: private(控制缓存的行为)

Connection: close/Keep-Alive(HTTP请求的版本的特点)

Date: Tue, 11 Jul 2000 18:23:51 GMT(响应网站的时间)


4.讲讲 HTTPS 是如何做加密的,说下非对称加密算法 。

通过非对称加密和对称加密结合的方式。先通过请求获取到CA证书相关的密文,然后通过CA机构的公钥将CA证书密文进行解密,解密后获得CA证书信息,证书中有很多信息,包括非对称加密的公钥。然后判断证书是否合法,如果合法则通过公钥加密随机数,然后传递给服务端。服务端通过私钥解密随机数,然后通过此随机数进行对称加解密传输。

非对称加密算法密钥分为两种,分别是公钥和私钥。公钥通常存放在客户端,私钥通常存放在服务端。通过公钥进行加密的必须通过私钥进行解密,通过私钥进行加密的必须通过公钥进行解密。非对称加密的优点是安全性高,因为客户端通过公钥进行加密的内容必须通过服务端的私钥进行解密,因此不用担心被别人破解。缺点是效率相对于对称加密低,代表性的非对称加密算法有:RSA、ElGamal等。

5.TCP和UDP的区别

TCP(传输控制协议)是可靠数据传输的通用协议。UDP(用户数据报协议)是面向无连接的协议,采用该协议不需要两个应用程序建立连接,UDP不提供数据差错恢复,数据重传,因此安全性较差。

6.OSI与TCP/IP各层的结构与功能,都有哪些协议

OSI开放式系统互联 TCP/IP传输控制协议 OSI模型有7层 TCP/IP模型有5层

OSI模型

物理层:规定通信设备的机械的、电气的、功能的和过程的特性,用以建立、维护和拆除物理链路连接。

数据链路层:传输有MAC地址的帧以及错误检测功能

网络层:(两个主机之间)为数据包(packets)选择路由

传输层:(两个主机的应用进程之间)提供端对端的接口

会话层:访问验证和会话管理等(如服务器验证用户登录)

表示层:数据格式化,代码转换,数据加密等

应用层:为操作系统或网络应用程序提供访问网络服务的接口:文件传输,电子邮件,文件服务,虚拟终端等

TCP/IP模型

物理层

数据链路层

网络层:IP,ICMP

传输层:TCP,UDP

应用层(对应OSI会话层、表示层、应用层):HTTP,FTP,DNS

C++程序员必看,抓住音视频开发的大浪潮!冲击年薪60万

7.TCP的三次握手过程?为什么会采用三次握手,若采用二次握手可以吗?

①三次握手的过程:客户端向服务端发送连接请求,服务端收到连接请求并向客户端发送确认请求,客户端在对服务端发送的确认请求进行确认并发送给服务端,此时三次握手就完成了。

②.采用三次握手是为了防止客户端失效的连接请求报文段突然又传送到服务端,因而产生错误。失效的连接请求报文段是指:客户端发出的连接请求没有收到服务端的确认,于是经过一段时间后,客户端又重新向服务端发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,客户端第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到服务端,服务端以为是客户端又发起的新连接,于是服务端同意连接,并向客户端发回确认,但是此时客户端根本不会理会,服务端就一直在等待客户端发送数据,导致服务端的资源浪费。所以采用二次握手不可以。

8.Http协议位于TCP/IP模型的第几层?为什么说Http协议是可靠的数据传输协议?

TCP/IP模型从上到下分别是:应用层——>传输层——>网络层——>数据链路层——>物理层;http位于应用层。由于TCP/IP协议是可靠的数据传输协议,位于数据传输层,而http是基于数据传输层的tcp/ip协议的,所以http是可靠的数据传输协议。

9.HTTP协议的结构?

请求报文:请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体

响应报文:状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体

10.HTTP怎么处理长连接?

在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有: Connection:keep-alive。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

11.http协议版本有几种,它们分别有什么区别?

HTTP/0.9:只接受get请求,没有在通信中指定版本号,且不支持请求头。由于该版本不支持post请求,因此客户端无法向服务端传递太多信息,已过时。

HTTP/1.0:第一个在通信中指定版本号的版本,增加了请求头,增加了状态码,content-type可以传递其他类型。缺点是明文传输安全性差,header特别大,每次请求资源都要新建一个tcp连接。

HTTP/1.1:可以设置keeplive,让http复用tcp连接;支持管道传输,请求发出后可以继续发送请求,以便降低线路负载,提高传输速度;支持了HOST头,以便让服务端知道请求的域名是哪个;后续发布更新的内容增加了TLS支持,即https;支持四种模型:短连接,可重用tcp的长链接,服务端push模型(服务端主动将数据推送到客户端cache中),websocket模型。

HTTP/2.0:头部压缩;二进制分帧传输,更方便头部只传输差异部分;流多路复用,同一个服务下,只需要用一个连接,节省连接;服务器推送,一次客户端请求可以有多次服务端响应;可以在一个tcp连接中并发请求。

HTTP/3.0:基于谷歌的QUIC,底层使用udp代码tcp协议,这样解决了队头阻塞问题,同样无需握手,性能大大地提升,默认使用tls加密。

12.http get与post方法在项目中如何选择,有何区别

GET一般用于获取/查询资源信息,而POST一般用于更新资源信息

1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。

(1).所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。

注意:这里安全的含义仅仅是指是非修改信息。

(2).幂等的意味着对同一URL的多个请求应该返回同样的结果。

2.根据HTTP规范,POST表示可能修改变服务器上的资源的请求。

3 get提交数据会有大小的限制(1024k),post提交无限制

13.HTTP HTTPS的区别?

1.HTTP 的 URL 以 http:// 开头,而 HTTPS 的 URL 以 https:// 开头

2.HTTP 是不安全的,而 HTTPS 是安全的。

3.HTTP 标准端口是 80 ,而 HTTPS 的标准端口是 443

4.在 OSI 网络模型中,HTTP 工作于应用层,而 HTTPS 工作在传输层(HTTP+TLS,其中TLS是在传输层)

5.HTTP 无需加密,而 HTTPS 对传输的数据使用SSL加密的

6.HTTP 无需证书,而 HTTPS 需要认证证书

14.HttpClient与HttpUrlConnection的区别

此处延伸:Volley里用的哪种请求方式(2.3前HttpClient,2.3后HttpUrlConnection)

首先HttpClient和HttpUrlConnection 这两种方式都支持Https协议,都是以流的形式进行上传或者下载数据,也可以说是以流的形式进行数据的传输,还有ipv6,以及连接池等功能。HttpClient这个拥有非常多的API,所以如果想要进行扩展的话,并且不破坏它的兼容性的话,很难进行扩展,也就是这个原因,Google在Android6.0的时候,直接就弃用了这个HttpClient. 而HttpUrlConnection相对来说就是比较轻量级了,API比较少,容易扩展,并且能够满足Android大部分的数据传输。比较经典的一个框架volley,在2.3版本以前都是使用HttpClient,在2.3以后就使用了HttpUrlConnection。

15.Socket建立网络连接的步骤

建立Socket连接至少需要一对套接字,其中一个运行与客户端--ClientSocket,一个运行于服务端--ServiceSocket

1、服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。注意:客户端的套接字必须描述他要连接的服务器的套接字,指出服务器套接字的地址和端口号,然后就像服务器端套接字提出连接请求。

3、连接确认:当服务器端套接字监听到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务端套接字则继续处于监听状态,继续接收其他客户端套接字的连接请求。

16.HTTP请求的完整过程?

Http请求的过程,与电脑上访问一个网页大概相同

建立TCP连接

在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。

Web浏览器向Web服务器发送请求命令

一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。

Web浏览器发送请求头信息

浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

Web服务器应答 客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。

Web服务器发送应答头信息

正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

Web服务器向浏览器发送数据

Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

Web服务器关闭TCP连接

一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive

TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

17.浏览器输入地址到返回结果发生了什么

1.DNS解析

2.TCP连接

3.发送HTTP请求

4.服务器处理请求并返回HTTP报文

5.浏览器解析渲染页面

6.连接结束

在浏览器中输入www.baidu.com后执行的全部过程

1、客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。

2、在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。

3、客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,我不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。

4、客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。

18.Cookie与Session的作用于原理?

cookie机制:客户端保持状态。“Set-Cookie”域;cookie的内容主要包括:名字,值,过期时间,路径和域。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

session机制:服务器端保持状态。 当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个);如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

19.网络劫持的类型原理

1.DNS劫持、欺骗、污染

2.http劫持:重定向、注入js,http注入、报文扩展

20.多线程断点续传的步骤?

1.将文件平分,然后在多个线程中进行下载。

2.然后可以通过HttpURLConnection中的setRequestProperty()方法设置下载文件的范围,从哪开始到哪结束。

3.然后开始往文件里面写,此处用到RandomAccessFile的特性,可以从文件的任意位置开始写。

21.从网络加载一个10MB的图片,要注意什么?

1.图片要分块加载,创建BitmapRegionDecoder实例,然后获取图片宽高和加载特定区域的原始精度的Bitmap对象,最后调用BitmapRegionDecoder类中的recycle()并回收释放Native层内存;

2.使用LruCache,缓存加载过的图片区域;

3.手势处理,直接使用ScaleGestureDetetor和GestureDetetor来处理手势逻辑;

4.滑动逻辑使用Scroller+ComputeScroller+scrollTo来完成。

22.有没有抓过包?网络抓包原理?

使用fiddler抓过包,fiddler是强大的抓包工具,不仅可以支持http请求抓包而且可以支持https请求抓包,不仅可以支持pc端抓包,还支持手机app端抓包。

fiddler app端抓包简要步骤:

①.手机与电脑处于同一局域网;查看fiddler的端口号,一般是8888;然后查看电脑的本地ip。

②.设置手机代理,配置主机名与电脑的本地ip一致,端口与fiddler的端口号一致。

③.抓取http请求不需要下载证书,抓取https请求需要下载证书;打开手机地址http://10.224.xx.xx:8888 ,中间xx是本地ip地址,然后上面会有个安装证书的界面,点击安装即可。

④.设置过滤,防止请求内容太多,可以设置只抓取远程客户端请求,然后就可以进行抓包了。

fiddler抓包原理:

Fiddler是位于客户端和服务器端之间的HTTP代理, 它能够记录客户端和服务器之间的所有 HTTP(S)请求,可以针对特定的HTTP(S)请求,分析网络传输的数据,还可以设置断点、修改请求的数据和服务器返回的数据

Fiddler在浏览器与服务器之间建立一个代理服务器,Fiddler工作于七层中的应用层,能够捕获通过的HTTP(S)请求。Fiddler启动后会自动将代理服务器设置成本机,默认端口为8888。Fiddler不仅能记录PC上浏览器的网络请求数据,还可以记录同一网络中的其他设备的HTTP(S)请求数据。

二.网络框架相关内容

1.谈一谈你对Volley的理解?

常用网络框架之一,Volley总共有三种线程,默认一个UI线程,一个缓存调用线程,四个Network调度线程,首先在UI线程中会将请求添加到优先级请求队列中,然后如果开启缓存则在进入Cache调用线程,然后在Cache调用线程中进行筛选,如果命中则将缓存结果分发到UI线程;如果未命中或者是没有开启缓存功能则是交给Network线程池处理,处理完成后会根据处理结果如果需要更新cache则更新然后分发给UI线程;每次请求都是执行与UI线程,终止与UI线程。然后底层执行的网络框架在android2.3以下用的是HttpClient,在android2.3及以上用的是HttpUrlConnection。

使用方式:通过Volley的newRequestQueue()方法创建RequestQueue对象,然后将request(一般是StringRequest、JsonRequest或者自定义request)添加到RequestQueue对象中即可。

Volley的优点是容易扩展,因为他是面向接口的思想,可以取消请求,支持请求重试和优先级设置,支持并发请求,适合数据量小和通信频繁的网络操作。缺点是对一些比较大的资源下载传输比较慢,加载图片性能也不是很好。

2.HttpUrlConnection和HttpClient的区别?

HttpClient和HttpUrlConnection这种方式都支持Https协议,都是以流的形式进行上传或者下载数据,也可以以流的形式进行数据的传输,还有ipv6以及连接池等功能。HttpClient这个拥有非常多的API,所以如果想要进行扩展的话,并且不破坏它的兼容性的话,很难进行扩展,也就是这个原因,谷歌在android6.0的时候,直接就弃用了这个HttpClient.而HttpUrlConnection相对来说就是比较轻量级了,API比较少,容易扩展,并且能够满足Android大部分的数据传输。

3.怎么使用OkHttp的拦截器?

OkHttp有两种自定义拦截器,分别是应用拦截器和网络请求拦截器;应用拦截器可以用过new OkHttpClient.Builder().addInterceptor(interceptor)和new OkHttpClient().interceptors().add(interceptor)方式添加拦截器,网络请求拦截器可以通过new OkHttpClient.Builder().addNetworkInterceptor(interceptor)和new OkHttpClient().networkInterceptors().add(interceptor)添加网络请求拦截器;应用拦截器一般用于查看请求和响应信息的,一般用于请求和响应信息的日志打印,网络请求拦截器一般用于修改请求数据,例如:可以添加、删除或替换请求头信息,还可以改变的请求携带的实体。

4.OkHttp有哪些拦截器?

OkHttp本身有五个默认拦截器,然后还有两个可以自定义的拦截器,两个自定义拦截器分别是应用拦截器和网络请求拦截器,五个默认拦截器是重试和重定向拦截器、桥接拦截器、缓存拦截器、连接拦截器和呼叫服务器拦截器。

自定义的应用拦截器一般用于打印请求和响应的日志信息。

自定义的网络请求拦截器一般用于修改请求数据使用。

重试和重定向拦截器有两大作用,一是当网络请求出现异常并且符合重试条件则重新发送请求,例如:超时异常,二是当网络响应数据中包含重定向信息时则创建重定向请求并发送,例如返回码有301,302等等。

桥接拦截器用于对网络请求前的请求头做一些设置,例如:请求内容长度、编码、gzip压缩、cookie等,还有对获取响应后的数据保存cookie,在下次请求则会读取对应的数据设置进入请求头,默认的CookieJar不提供实现,如果使用gzip返回的数据,则使用GzipSource包装便于解析。

缓存拦截器用于交出之前读取并判断是否使用缓存;获得结果后判断是否缓存。

连接拦截器负责找到或者新建一个连接,并获得对应的socket流;在获得结果后不进行额外的处理。

请求服务器拦截器进行真正的与服务器的通信,向服务器发送数据,解析读取的响应数据。

5.通过比较Volley、OkHttp和Retrofit来说说他们的区别?

Volley是在android2.3及以上基于HttpUrlConnection实现、android2.3以下是基于HttpClient实现的网络请求框架,支持网络请求排序、取消请求,支持多并发请求,容易扩展,可以支持基于其他框架,例如:OkHttp,适合网络请求频繁或者数据量小的应用场景。缺点是进行大数据量的网络请求比较慢,加载图片性能也不是很好。

OkHttp:是一个功能强大且高性能的网络请求框架。支持Spdy、Http 1.X、Http 2.0、Quic、Websocket协议;连接池底层复用TCP(Socket),减少请求延时;无缝的支持GZIP,减少网络请求流量;缓存响应数据,去除不必要的重复请求;请求失败自动重试,根据错误码自动重定向等等。缺点是网络请求完成需要手动切换到主线程或者通过框架封装。适用于网络请求频繁或者传输数据量大的应用场景。并且在android 4.4及以上版本HttpUrlConnection的http和https协议的底层实现用的就是OkHttp。

Retrofit:基于RESTFul的API设计风格,底层网络请求实现逻辑依然是OkHttp。通过注解配置请求,包括请求头、请求方法、请求参数等,可以通过多种解析器将数据解析序列化,支持RxJava。使用简单、代码简洁。Retrofit+RxJava(java中)和Retrofit+协程Flow(Kotlin中)是目前比较流行的组合。

6.OkHttp中使用了哪些设计模式?

建造者(Builder)设计模式,这个可以随处可见的在OkHttpClient、request、Response、MultipartBody、HttpUrl等等随处可见。

责任链模式,这是OkHttp中最核心的HTTP请求拦截器,里面实现了OkHttp的绝大部分功能。

门面模式,将整个系统的复杂性给隐藏起来,将子系统接口通过一个客户端OkHttpClient统一暴露出来。

工厂模式,Call和WebSocket对象实例的生成方式是通过工厂方法来实现的。

观察者模式,在监听请求相应的地方和监听websocket的地方使用了观察者模式。

单例模式,有个类Platform 主要功能是判断是否是android平台的,此类中用到了饿汉单例模式,先实例化一个Platform对象,然后在通过get()方法获取.

7.OkHttp可以设置哪些超时?

可以设置四个超时,连接超时(ConnectTimeout),是三次握手+SSL建立时间,读取超时写入超时和所有流程在一起的超时(总超时)。


8.Retrofit中怎么使用的动态代理,有什么好处?

在retrofit的create()方法中使用了动态代理,内部逻辑是通过Proxy.newProxyInstance中的最后一个参数InvocationHandler实例的invoke()方法获取到调用的接口的方法,以及方法的一些信息,例如:方法名、注解、参数等,然后根据泛型包装成Call<T>的对象,最后执行call.equeue()方法或者call.excute()方法进行请求返回响应。

9.如何自定义一个网络请求框架?

首先需要通过Builder(建造者)模式将需要配置的数据通过build添加进去;

然后将请求添加到队列中,这里至少需要定义三种队列,同步请求正在执行的队列,异步请求正在执行的队列,异步请求等待队列,根据条件(请求最大量、同域名的请求最大量)将请求添加到执行队列还是等待队列。

如果是异步请求然后通过分发器将请求分发到线程池中进行操作,这里需要自定义线程池,这个可以采用核心线程数为0,最大线程数一定的值,然后阻塞队列是0的那个,保证请求及时发出。

然后在线程池中的执行过程可以通过责任链模式,将各个阶段的责任明细清晰,可以参照okhttp的五个默认拦截器(重试和重定向拦截器、桥接拦截器、缓存拦截器、连接拦截器和呼叫服务器拦截器)和两个自定义拦截器(应用拦截器和网络请求拦截器)。

最后获得响应看是否需要切换到主线程,如果需要则通过handler切换到主线程。

标签列表
最新留言