OkHttp原始碼徹底解析(五)OkHttp連線池

2021-09-01 20:11:18 字數 3404 閱讀 4493

本系列文章:

okhttp原始碼徹底解析(一)okhttp請求流程

okhttp原始碼徹底解析(二)okhttp架構及api原始碼

okhttp原始碼徹底解析(三)okhttp3.0***原理——責任鏈模式

okhttp原始碼徹底解析(四)okhttp***的作用

okhttp原始碼徹底解析(五)okhttp連線池

目錄

okhttp連線池

連線池的意義——keepalive機制

從***流程了解連線池

連線池connectionpool的建立

連線池的快取操作

連線池是用來管理和復用網路連線物件的,而網路連線的主角就是connection/realconnection.

okhttp3將客戶端與伺服器之間的連線抽象為connection/realconnection,為了管理這些連線的復用而設計了connectionpool。共享相同address的請求可以復用連線

復用連線,減少了頻繁的網路請求導致效能下降的問題。我們知道,http是基於tcp協議的,而tcp建立連線需要經過三次握手,斷開需要經過四次揮手,因此,http中新增了一種keepalive機制,當資料傳輸完畢後仍然保持連線,等待下一次請求時直接復用該連線。

一次響應的流程

在高併發的請求連線情況下或者同個客戶端多次頻繁的請求操作,無限制的建立會導致效能低下。

如果使用keep-alive

timeout空閒時間內,連線不會關閉,相同重複的request將復用原先的connection,減少握手的次數,大幅提高效率。

並非keep-alive的timeout設定時間越長,就越能提公升效能。長久不關閉會造成過多的殭屍連線和洩露連線出現。

在講解連線池之前,先了解okhttp的***

okhttp***流程圖

上面的***分別是:

1.失敗重連***:

乙個迴圈來不停的獲取response。每迴圈一次都會獲取下乙個request,如果沒有,則返回response,退出迴圈。而獲取下乙個request的邏輯,是根據上乙個response返回的狀態碼,分別作處理。

2.橋接***:

請求從應用層資料型別型別轉化為網路呼叫層的資料型別。將網路層返回的資料型別 轉化為 應用層資料型別。(補足缺失的請求頭等)

3.快取***:

cacheinterceptor主要作用是將請求 和 返回 關連得儲存到快取中。客戶端與服務端根據一定的機制,在需要的時候使用快取的資料作為網路請求的響應,節省了時間和頻寬。

4.連線*** 

與請求伺服器的***是網路互動的關鍵。為請求伺服器***建立可用的連線,建立用於網路io流  的realconnection物件

5.請求伺服器的***:

完成了最後發起網路請求的工作。將http請求寫入網路io流,從io流讀取網路資料

與連線***要劃分為兩個***,除了解耦之外,更重要的是在這兩個流程之間還可以插入乙個專門為websocket服務的***( websocket一種在單個 tcp 連線上進行全雙工通訊的協議,本文不做詳解)。

關於這部分不具體展開,感興趣可以看我的另外兩篇部落格,可以說是非常詳細地介紹了***的原理及應用

***原理

其中,與連線池相關的是失敗重連***連線***

1.retryandfollowupinterceptor將建立的streamallocation物件傳遞給後面執行的interceptor

2.connectinterceptorrealinterceptorchain獲取前面的interceptor傳過來的streamallocation物件,執行streamallocation.newstream()完成前述所有的連線建立工作,建立的用於網路io的realconnection物件,以及對於與伺服器互動最為關鍵的httpcodec等物件傳遞給後面的interceptor,也就是callserverinterceptor

streamallocation.newstream()新建了io流,將請求序列化發到網路,將網路資料反序列化並接收(請求伺服器的***)

realconnection底層連線著socket,就是實現了跨程序與網路上其他裝置互動的底層實現。

okhttp3的使用者可以自行建立connectionpool,對最大空閒連線數及連線的保活時間進行配置,並在okhttpclient建立期間,將其傳給okhttpclient.builder,在okhttpclient中啟用它。沒有定製連線池的情況下,則在okhttpclient.builder構造過程中以預設引數

預設情況下,connectionpool最多儲存5個處於空閒狀態的連線,且連線的預設保活時間為5分鐘。也就是預設支援5個併發socket連線,預設的keepalive時間為5分鐘,當然我們可以在構建okhttpclient時設定不同的值

connectionpool提供對deque進行操作的方法分別為putgetconnectionbecameidleevictall幾個操作。分別對應放入連線、獲取連線、移除連線、移除所有連線操作。

遍歷connections快取列表,當某個連線計數的次數小於限制的大小以及request的位址和快取列表中此連線的位址完全匹配。則直接復用快取列表中的connection作為request的連線。

OkHttp原始碼解析

okhttp對外的入口,可以理解為okhttp的平台,其定義了網路協議 dns 請求時間等 網路請求的執行者,enqueue為非同步請求需要傳入okhttpcallback,exexute 為同步請求,直接返回response 網路請求資訊的封裝類,內建url head 請求方式method 請求引...

okhttp原始碼解析

okhttp是乙個非常優秀的網路請求框架,已被谷歌加入到android的原始碼中。目前比較流行的retrofit也是預設使用okhttp的。所以okhttp的原始碼是乙個不容錯過的學習資源,學習原始碼之前,務必熟練使用這個框架,否則就是跟自己過不去。至於為什麼有這麼多優點,各位看官老爺在下面的原始碼...

OkHttp原始碼解析 一

執行請求的地方.client.newcall request enqueue new callback override public void onresponse call call,response response throws ioexception okhttpclient的newcal...