国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 圖文詳解OkHttp的超時時間

圖文詳解OkHttp的超時時間

2022-02-17 15:27今天i你好嗎 Java教程

HTTP是現代應用常用的一種交換數據和媒體的網絡方式,高效地使用HTTP能讓資源加載更快,節省帶寬,OkHttp是一個高效的HTTP客戶端,下面這篇文章主要給大家介紹了關于OkHttp超時時間的相關資料,需要的朋友可以參考下

 

前言

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

本文以 "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有著密不可分的關系,其內部維護了一個Watchdog,單獨開一個線程死循環判斷是否超時

圖文詳解OkHttp的超時時間

 

connectTimeout:

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

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

 

callTimeout:

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

圖文詳解OkHttp的超時時間

在execute方法中開始計時

圖文詳解OkHttp的超時時間

在timeoutExit方法中結束計時

圖文詳解OkHttp的超時時間

 

pingInterval

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

圖文詳解OkHttp的超時時間

圖文詳解OkHttp的超時時間

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

圖文詳解OkHttp的超時時間

圖文詳解OkHttp的超時時間

圖文詳解OkHttp的超時時間

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

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

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

 

writeTimeout

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

圖文詳解OkHttp的超時時間

其中第二處和第三處的用用法是一致的,最后都是調用了

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

這寫到底是什么意思呢?

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

圖文詳解OkHttp的超時時間

圖文詳解OkHttp的超時時間

/**

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都被封裝了一個超時機制,需要在我們設置的時間內寫出TIMEOUT_WRITE_SIZE(64k)的數據,如果無法完成即為超時,所以,我們在上次文件時明明只設置了幾十秒的超時時間卻不會超時.

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

圖文詳解OkHttp的超時時間
圖文詳解OkHttp的超時時間

圖文詳解OkHttp的超時時間
圖文詳解OkHttp的超時時間

圖文詳解OkHttp的超時時間
圖文詳解OkHttp的超時時間

圖文詳解OkHttp的超時時間

圖文詳解OkHttp的超時時間

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

 

readTimeout

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

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

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

圖文詳解OkHttp的超時時間

圖文詳解OkHttp的超時時間

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

圖文詳解OkHttp的超時時間

圖文詳解OkHttp的超時時間

然后還漏了一點:

圖文詳解OkHttp的超時時間

socket.setSoTimeout(chain.readTimeoutMillis());


這行代碼什么意思呢?

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

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

附上okhttp的默認超時時間

圖文詳解OkHttp的超時時間

 

總結

到此這篇關于OkHttp的超時時間的文章就介紹到這了,更多相關OkHttp超時時間內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.jianshu.com/p/df7b31b4a624

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 激情综合在线 | 久草久草久草 | 中文字幕欧美在线 | 亚洲一级在线 | 精品成人免费一区二区在线播放 | 午夜精品一区二区三区在线视频 | 久久亚洲天堂 | 久久亚洲精品裙底抄底 | 91视频 - 88av| 久久久精品日本 | 亚洲福利精品 | 欧美黄视频 | 69日影院| 欧美剧场 | 精品久久久久久亚洲综合网 | 天天射天天干 | 久久综合狠狠综合久久综合88 | 伊人五月| 操操操操操操 | 国产欧美精品一区 | 欧美在线 | 亚洲 | 成人精品久久久 | 永久91嫩草亚洲精品人人 | av大片网| 一区二区三区精品视频 | 日韩一区电影 | 国产成人精品一区 | 久久首页 | 欧美日韩国产综合视频 | 欧美日韩中文 | 国产高清在线精品一区二区三区 | 久久99精品国产麻豆婷婷洗澡 | 国产成人精品久久二区二区91 | 99精品在线 | 日韩在线字幕 | 欧美日韩一级二级三级 | 日韩免费 | 91黄色免费视频 | 成人网色| 97操视频| 日韩一区二区三区福利视频 |