最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

圖文詳解OkHttp的超時時間

 更新時間:2021年10月13日 12:04:34   作者:今天i你好嗎  
HTTP是現(xiàn)代應用常用的一種交換數(shù)據(jù)和媒體的網(wǎng)絡方式,高效地使用HTTP能讓資源加載更快,節(jié)省帶寬,OkHttp是一個高效的HTTP客戶端,下面這篇文章主要給大家介紹了關于OkHttp超時時間的相關資料,需要的朋友可以參考下

前言

雖然網(wǎng)上有很多關于okhttp超時時間的文章但大多都一筆帶過并沒有進行詳細的講解各自的作用,于是就看了下源碼大致寫一下其中的發(fā)現(xiàn).

本文以 'com.squareup.okhttp3:okhttp:3.12.0'源碼為參考

首先我們一共可以設置5個超時時間分別如下:

OkHttpClient client = new OkHttpClient.Builder()

.connectTimeout(30, TimeUnit.SECONDS)

.callTimeout(120, TimeUnit.SECONDS)

.pingInterval(5, TimeUnit.SECONDS)

.readTimeout(60, TimeUnit.SECONDS)

.writeTimeout(60, TimeUnit.SECONDS)

.build();

其中callTimeout,readTimeout,writeTimeout和okio的AsyncTimeout有著密不可分的關系,其內(nèi)部維護了一個Watchdog,單獨開一個線程死循環(huán)判斷是否超時

connectTimeout:

指的是建立連接所用的時間,適用于網(wǎng)絡狀況正常的情況下,兩端連接所用的時間。

通過跟源碼發(fā)現(xiàn)這個值用在了 socket.connect(address, connectTimeout);

callTimeout:

這個值從調(diào)用call.execute();和enqueue();這兩個方法開始計時,時間到后網(wǎng)絡還未請求完成將調(diào)用cancel();方法
在RealCall類中可以看到在構造方法中創(chuàng)建timeout匿名內(nèi)部類

在execute方法中開始計時

在timeoutExit方法中結束計時

pingInterval

通過跟源碼我們可以看到,這個值只有http2和webSocket中有使用

如果設置了這個值會定時的向服務器發(fā)送一個消息來保持長連接

所以在寫websocket時是完全可以只用設置這個值來保持長連接的.

客戶端在發(fā)送ping消息時服務端會相應的返回pong消息來進行回應.同時okhttp也實現(xiàn)了pong,服務端在發(fā)起ping的時候客戶端會通過pong來進行回應,即:在進行長連接時,客戶端不需要進行只需要服務端進行定時ping也是可以保持長連接的.

接下來就開始講和我們密切相關的readTimeout和writeTimeout了,當然也是最復雜的.其中最重要的還是readTimeout,我們先看writeTimeout

writeTimeout

這個值大致有3個地方用到

其中第二處和第三處的用用法是一致的,最后都是調(diào)用了

sink.timeout().timeout(writeTimeout, MILLISECONDS);

這寫到底是什么意思呢?

這個就不得不說okio了,okhttp中幾乎所有的流的操作都是由okio完成的,在okio.AsyncTimeout中對Sink(類似于OutputStream)和Source(類似于InputStream)進行了一層封裝

/**

Don't write more than 64 KiB of data at a time, give or take a segment. Otherwise slow
connections may suffer timeouts even when they're making (slow) progress. Without this, writing
a single 1 MiB buffer may never succeed on a sufficiently slow connection.
*/
private static final int TIMEOUT_WRITE_SIZE = 64 * 1024;

這其中的邏輯還是相當復雜的,大致意思就是所有的sink都被封裝了一個超時機制,需要在我們設置的時間內(nèi)寫出TIMEOUT_WRITE_SIZE(64k)的數(shù)據(jù),如果無法完成即為超時,所以,我們在上次文件時明明只設置了幾十秒的超時時間卻不會超時.

在http2中就沒有再使用okio的超時機制了,當然超時計時器還是用的AsyncTimeout.的Watchdog




可以看到,在http2中采用的是線程等待的策略

readTimeout

readTimeout和writeTimeout幾乎完全一樣,只是操作相反,而且header的讀取和body的讀取是分開進行的,由于header數(shù)據(jù)量較小就不用討論了.

okio中每次讀取不大于8k.

final class Segment {
/** The size of all segments in bytes. */
static final int SIZE = 8192;

http2中每次讀取不大于8k.

然后還漏了一點:

socket.setSoTimeout(chain.readTimeoutMillis());


這行代碼什么意思呢?

setSotimeout(10000)是表示如果對方連接狀態(tài)10秒沒有收到數(shù)據(jù)的話強制斷開客戶端。
如果想要長連接的話,可以使用心跳包來通知服務器,也就是我沒有發(fā)給你數(shù)據(jù),但是我告訴你我還活著.

最后,如果超時時間設置的如果是0,那么代表超時時長為無限.

附上okhttp的默認超時時間

總結

到此這篇關于OkHttp的超時時間的文章就介紹到這了,更多相關OkHttp超時時間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Sa-Token中的SaSession對象使用學習示例詳解

    Sa-Token中的SaSession對象使用學習示例詳解

    這篇文章主要為大家介紹了Sa-Token中的SaSession對象使用學習示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 將bean注入到Spring中的方式總結

    將bean注入到Spring中的方式總結

    在Java的Spring框架中,將bean注入到容器中是核心概念之一,這是實現(xiàn)依賴注入的基礎,Spring提供了多種方式來將bean注入到容器中,本文給大家總結了將bean注入到Spring中的幾種方式,需要的朋友可以參考下
    2023-12-12
  • Java實現(xiàn)Linux下雙守護進程

    Java實現(xiàn)Linux下雙守護進程

    這篇文章主要介紹了Java實現(xiàn)Linux下雙守護進程的思路、原理以及具體實現(xiàn)方式,非常的詳細,希望對大家有所幫助
    2014-10-10
  • Java常用流程控制語句實現(xiàn)原理解析

    Java常用流程控制語句實現(xiàn)原理解析

    這篇文章主要介紹了Java常用流程控制語句實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Jmeter跨線程組共享cookie過程圖解

    Jmeter跨線程組共享cookie過程圖解

    這篇文章主要介紹了Jmeter跨線程組共享cookie過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • SpringMVC的組件之HandlerExceptionResolver詳解

    SpringMVC的組件之HandlerExceptionResolver詳解

    這篇文章主要介紹了SpringMVC的組件之HandlerExceptionResolver詳解,不管是在處理請求映射(HandlerMapping),還是在請求被處理(Handler)時拋出的異常,DispatcherServlet都會委托給HandlerExceptionResolver進行異常處理,該接口只有一個方法,需要的朋友可以參考下
    2023-10-10
  • Java面試題沖刺第二十九天--JVM3

    Java面試題沖刺第二十九天--JVM3

    這篇文章主要為大家分享了最有價值的三道關于JVM的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結構和算法相關的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java程序員容易犯的10大低級錯誤

    Java程序員容易犯的10大低級錯誤

    這篇文章主要介紹了Java程序員容易犯的10大低級錯誤,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • SpringMVC框架post提交數(shù)據(jù)庫出現(xiàn)亂碼解決方案

    SpringMVC框架post提交數(shù)據(jù)庫出現(xiàn)亂碼解決方案

    這篇文章主要介紹了SpringMVC框架post提交數(shù)據(jù)庫出現(xiàn)亂碼解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Spring JPA自定義查詢結果的接收方式

    Spring JPA自定義查詢結果的接收方式

    這篇文章主要介紹了Spring JPA自定義查詢結果的接收方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

东宁县| 大余县| 大悟县| 安远县| 南宫市| 含山县| 富蕴县| 当阳市| 天津市| 瓦房店市| 宜章县| 正宁县| 博野县| 上杭县| 泗阳县| 司法| 平度市| 阜南县| 礼泉县| 德化县| 林芝县| 麻江县| 金寨县| 高唐县| 恩平市| 荥经县| 澎湖县| 徐水县| 长乐市| 柳河县| 南康市| 丹巴县| 昭苏县| 青神县| 峨边| 阳曲县| 扶绥县| 临泽县| 织金县| 淮南市| 抚顺市|