一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人猫咪maomiav永久网址 | 亚洲第一网色综合久久 | 美女牲交毛片一级视频 | 欧美日韩在线观看区一二 | 久9青青cao精品视频在线 | 色播艾小青国产专区在线播放 | 教练你好大轻点漫 | 99国产高清久久久久久网站 | 日韩理论在线观看 | 91尤物在线 | 免费欧美一级片 | 国产精品视频久久久 | 乌克兰一级毛片9一18 | 日韩国产欧美一区二区三区 | 午夜精品久久久久久久99 | 美女一级ba大片免色 | 成人免费一区二区三区在线观看 | ange venus与黑人 | 国产男女爱视频在线观看 | 波多野结衣中文字幕 | 亚洲毛片基地 | bedfriend泰剧全集免费观看 | 精品久久久久久无码人妻国产馆 | 国产一区二区免费福利片 | 日本69sex护士www | 成年人在线观看视频免费 | 2012中文字幕中字视频 | 男人天堂影院 | 国产剧情一区 | 国产黄频在线观看高清免费 | 毛片a区 | 国产a不卡片精品免费观看 国产aaa伦理片 | 青草视频网站 | 亚洲一区二区日韩欧美gif | www.尤物视频| porno18老师hd| 咪咪爱小说 | 暖暖暖免费观看在线观看 | 啊皇上你好大要知画 | 国产99在线a视频 | 99久热只有精品视频免费看 |