2012-05-12 43 views
2

我有此靜態函數basicly使得到的網頁的連接時,與它一起發送後的數據,並返回所接收的響應(JSON對象)DefaultHttpClient超時設置爲10個secondes但只需要1秒超時

的我遇到的問題是無論我設置了多長時間,它只會在1秒內發生超時,超時時間爲6秒,這種情況不會發生。

public static String makeRequest(String path, String info) throws Exception 
{ 
    HttpParams httpParameters = new BasicHttpParams(); 
    int timeoutConnection = 6000; 
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
    int timeoutSocket = 6000; 
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

    DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters); 
    HttpPost httpost = new HttpPost(path); 
    StringEntity jsonobj = new StringEntity(info); 
    httpost.setEntity(jsonobj); 
    httpost.setHeader("Accept", "application/json"); 
    httpost.setHeader("Content-type", "application/json"); 
    ResponseHandler responseHandler = new BasicResponseHandler(); 

    String response = httpclient.execute(httpost, responseHandler); 
    return response; 

現在我已經看到了類似這樣的問題,但我找不到可以幫助我的答案。 有人說這是由於它不是線程安全的事實,但是,我不會同時進行多個調用,它都是按順序完成的。這個問題發生在第一次嘗試時,因爲這個原因,不應該發生,因爲沒有多個連接/ httpposts,更不用說來自不同的線程。

然而它最近發生了很多,有時幾天甚至幾天都沒有發生。

我試圖尋找在AndroidHttpClient,但它似乎並不支持HttpPost,這樣就不會有用或者(或我錯了嗎?)

的數據,兩者的路徑和方式是正確的,經過測試它。另外我的服務器沒有問題。

有人說它可以是你的網絡,但我今天測試了3個wifi網絡。勉強,在我的移動提供商的互聯網連接上,它不會或幾乎不會發生。

我讀過一個答案,它可能是因爲ISP更改標題信息。我曾嘗試爲用戶代理使用不同的值,但這也不起作用。

我希望有人可以幫助,因爲我會感激,因爲它真的讓我感到挫敗,這一直在發生。

回答

2

如果TCP在超時期限之前檢測到連接拒絕(即傳入RST),則表示失敗。在這種情況下等待超時沒有任何意義,並且預計重試只會以相同的方式再次失敗。超時是針對沒有響應的情況。

+0

好的,我已經搜索谷歌(沒有很多命中爲rst),但據我瞭解,org.apache.http.conn.ConnectTimeoutException也會因爲某些原因無法連接時觸發。第一,據我瞭解,它是TCP協議的連接重置位,用於重置連接。這很可能是問題所在,但爲什麼會發生這種情況(尤其是使用wifi),並且有沒有一種已知的方法來修復它,或者抓住並妥善處理它?因爲我嘗試過的重試不起作用,它只會一直失敗。 – Ghotirey

+1

@Ghotirey RST是一個'積極'的失敗。連接已被肯定地拒絕,無論是由主機,因爲沒有監聽端口,或通過防火牆,因爲它不會允許連接。在任何一種情況下,重試都是徒勞的。超時是針對沒有收到響應的情況,這可能表明數據包丟失或連接暫時中斷,所以值得重試。 – EJP