一、java.net.SocketTimeoutException: failed to connect to/103.83.45.229(port 443)from/192.168.1.124(port 49054)after 10000ms
可能出現的原因:
(1)在真機測試的時候,手機連接的數據流量,而不是公司的局域網. 把手機網絡連接設置為有局域網就可以了.
(2)設置的請求建立連接超時時間過短,沒有連接到服務器; 增加connectTimeout連接的時間;
(3)設置的請求建立連接超時時間過短,會拋出java.net.SocketException: connetct time out的異常。
二、java.net.SocketTimeoutException: SSL handshake timed out:
(1)設置的readTimeout過短,沒有讀取到資源;
三、java.io.IOException: unexpected end of stream on okhttp3.Address@XXXX
增加關閉連接即可
.addHeader("Connection", "close")
ConnectTimeout
指的是建立連接所用的時間,適用於網絡狀況正常的情況下,兩端連接所用的時間。
在java中,網絡狀況正常的情況下,例如使用HttpClient或者HttpURLConnetion連接時設置參數connectTimeout=5000即5秒,如果連接用時超過5秒就是拋出java.net.SocketException: connetct time out的異常。
ReadTimeout
指的是建立連接后從服務器讀取到可用資源所用的時間。
在這里我們可以這樣理解ReadTimeout:正常情況下,當我們發出請求時可以收到請求的結果,也就是頁面上展示的內容,但是當網絡狀況很差的時候,就會出現頁面上無法展示出內容的情況。另外當我們使用爬蟲或者其他全自動的程序時,無法判斷當前的網絡狀況是否良好,此時就有了ReadTimeout的用武之地了,通過設置ReadTimeout參數,例:ReadTimeout=5000,超過5秒沒有讀取到內容時,就認為此次讀取不到內容並拋出Java.net.SocketException: read time out的異常。
根據上面關於ConnectTimeout和ReadTimeout的描述,在我們使用需要設置這兩項參數的服務或程序時,應該對兩項參數一起設置。
一般而言兩項參數的數值可以設置成一樣的,但根據筆者個人經驗,可以把ReadTimeout設置的長一點,ConnectTimeout可以相對比較短,這是源於我們的網絡狀況一般較為穩定,連接時很少出現問題,但是讀取時因為數據下載時的網絡波動,出狀況的可能性更大一些。