2014-09-24 48 views
3

Apache的HttpClient的框架允許你指定連接超時和套接字超時,像這樣:有什麼辦法來區分連接超時和套接字超時?

final HttpParams httpParams = new BasicHttpParams(); 
if (connectionTimeout > 0) { 
    HttpConnectionParams.setConnectionTimeout(httpParams, connectionTimeout); 
} 
if (socketTimeout > 0) { 
    HttpConnectionParams.setSoTimeout(httpParams, socketTimeout); 
} 
HttpClient client = new DefaultHttpClient(httpParams); 

我想微調我的連接超時。 This question很好地解釋了設置之間的差異,但對調試拋出的異常沒有幫助。

我的問題是,什麼異常會引發每種類型的超時?我有一個java.net.SocketTimeoutException;這是從連接超時還是套接字超時?我懷疑這是後者,尤其是因爲信息中顯示「Read timed out」。連接超時會引發什麼異常? TimeoutExceptionConnectException?爲什麼在Apache Http Docs中捕獲的超時設置和拋出的異常之間沒有關係?

SocketTimeoutException的直接父類爲InterruptedIoExceptionIOException;前者只有SocketTimeoutException作爲子類,但IOException有許多子類。是否有另一個參考涵蓋了所有可以從HttpClient execute方法中獲得的異常?它只聲明它可以拋出一個IOException,這真的很寬泛。

回答

2

我從來沒有經歷過的Java API類之間的關係,但我認爲你需要的是

  1. java.net.ConnectException:數據包丟失,由於錯誤的網絡,網絡過載,太多請求到服務器,防火牆。

  2. java.net.SocketTimeoutException:套接字超時是在數據傳回給調用者時保持服務器套接字打開的時間量。這甚至可能是服務器仍然在處理和寫回數據,但它需要相當長的時間,客戶端已經超時等待它。