2011-09-09 35 views
86

我有一個使用庫的問題,它可能是庫或它可能是我使用它錯了!ConnectionTimeout與SocketTimeout的對比

基本上當我做到這一點(超時毫秒)

_ignitedHttp.setConnectionTimeout(1); // v short 
_ignitedHttp.setSocketTimeout(60000); // 60 seconds 

不產生超時異常工程確定,但是,當我這樣做:

_ignitedHttp.setConnectionTimeout(60000); // 60 seconds 
_ignitedHttp.setSocketTimeout(1);   // v short 

我得到一個Socket異常。

所以我的問題是爲什麼我不能模擬連接異常?我誤解了套接字和連接超時之間的區別嗎?圖書館是here(尚未正式實現)。

回答

159

A 連接超時僅在啓動TCP連接時發生。如果遠程機器沒有應答,通常會發生這種情況。這意味着服務器已關閉,您使用錯誤的IP/DNS名稱或服務器的網絡連接已關閉。

A 套接字超時專用於監視連續傳入的數據流。如果數據流在指定的超時時間內中斷,則認爲連接被中止/中斷。當然,這隻適用於所有時間接收數據的連接。

通過將套接字超時設置爲1,這將需要接收每毫秒的新數據(假設您讀取數據塊並且該塊足夠大)!

如果只有傳入的數據流停止超過一毫秒,則表示正在運行超時。

+1

如果服務器沒有關閉但是會很忙,您能否獲得連接超時?或者這會是一個套接字超時? – Robert

+7

這取決於 - 如果在服務器過載之前建立了TCP連接,你將得到一個套接字異常 - 否則你會得到一個連接異常,表明TCP連接不能建立。 – Robert

+0

什麼是移動設備的套接字超時和連接超時的典型值?通常比另一個大嗎? – Robert

42

A 連接超時是程序願意等待建立到另一個進程的連接的最大時間量。您目前沒有獲取或發佈任何應用程序數據,只是建立連接本身。

A 套接字超時是等待單個數據包時的超時時間。這是一個常見的誤解,即套接字超時是收到完整響應的超時。所以,如果套接字超時爲1秒,響應包含3個IP數據包,每個響應數據包需要0.9秒才能到達,總響應時間爲2.7秒,則不會有超時。

+0

好的。 1.我們可以說,當Connection已經建立時,SocketTimeout只能進入畫面嗎? 2.如果在收到3個數據包後5分鐘內沒有數據流?接收到第三個數據包後是否會出現SocketTimeout異常? –

+0

@SaurabhPatil 1.是的。請參閱[Wikipedia的HTTP協議技術概述](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Technical_overview)以進行確認。 2.一旦發送消息結束,不需要進一步的數據,所以套接字超時不會發生。請參閱[本答案](https://stackoverflow.com/a/4824738/4851565)。 – entpnerd