OKHttp源碼解析 (複用連接池)

原文地址:https://www.jianshu.com/p/6166d28983a2

複用連接池

相關的主要三個類

  1. RealConnection
  2. ConnectionPool
  3. StreamAllocation

對流的處理使用Okio,Okio是okhttp中用於處理io的模塊,沒接觸過的讀者可以參考這篇文章:https://www.jianshu.com/p/f5941bcf3a2d

RealConnection 要點

  1. 代表着鏈接socket的鏈路,如果擁有了一個RealConnection就代表了我們已經跟服務器有了一條通信鏈路
  2. 實現了三次握手等操作。
  3. 一個鏈接對應多個流,鏈接和流的對應關係通過StreamAllocation來記錄。

ConnectionPool 要點

管理http和http/2的鏈接,以便減少網絡請求延遲。同一個address將共享同一個connection。該類實現了複用連接的目標。

  1. ConnectionPool內部以隊列方式存儲連接
  2. 連接池最多維持5個連接,且每個鏈接最多活5分鐘
  3. 每次添加鏈接的時候回執行一次清理任務,清理空閒的鏈接。

StreamAllocation 要點

StreamAllocation 協調了三者的關係:鏈接、流和回調。

這裏談一下對StreamAllocation的個人理解。
比如我要創建一個流,是需要當前的Connection的,甚至如果當前沒有Connection,我是需要知道當前的ConnectionPool的。
這種邏輯的代碼無論是寫在RealConnection還是ConnectionPool還是Steam中都是不合理的,因此StreamAllocation中就處理了協調這些類的邏輯。

  1. 一個StreamAllocation中包括一個Steam和一個Connection。
  2. StreamAllocation中的方法包括:newStream(創建流),findHealthyConnection(找到可用的鏈接),streamFinished(關閉流),releaseIfNoNewStreams(釋放鏈接)等等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章