本系列文章:
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.connectinterceptor
從realinterceptorchain
獲取前面的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
進行操作的方法分別為put
、get
、connectionbecameidle
、evictall
幾個操作。分別對應放入連線、獲取連線、移除連線、移除所有連線操作。
遍歷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...