2016-12-22 88 views
0

我正在使用Apache Common的HTTPClient進行HTTP連接。 連接類型是POST,客戶端將從連接讀取輸出。 但是,無論連接狀態如何,我都需要能夠中止連接。這樣做的最好方法是什麼? 是否有內置超時? 此致敬禮。Apache HTTPClient隨時超時

編輯: 只是爲了澄清我的問題:
我希望用戶能夠選擇當連接被切斷。
換言之類似的功能的參數捲曲: CURLOPT_TIMEOUT https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html

回答

0

當您使用HttpClientBuilder HttpClient的實例的實例,可以傳遞的RequestConfig一個實例給構建器,這inturn接受2個參數。

SocketTimeout - 定義套接字超時(SO_TIMEOUT),以毫秒爲單位,即等待數據的超時值,或者換句話說,兩個連續數據包之間的最大非活動時間)。

ConnectTimeout - 確定連接建立之前的超時時間(以毫秒爲單位)。超時值爲零被解釋爲無限超時。

ConnectionRequestTimeout - 返回從連接管理器請求連接時使用的超時時間(以毫秒爲單位)。超時值爲零被解釋爲無限超時。

你要找的是SocketTimeout

RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECTION_TIMEOUT) 
       .setConnectionRequestTimeout(CONNECTION_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build(); 
httpClient = HttpClientBuilder.create().disableAutomaticRetries().setDefaultRequestConfig(requestConfig) 
       .setConnectionManager(poolingHttpClientConnectionManager).disableRedirectHandling().build(); 

你可以看看ConnectionKeepAliveStrategypage

+0

嗨,謝謝你的回覆。對不起,我想我沒有讓自己清楚。 我試過你的解決方案與套接字超時,但它不會停止連接。 基本上,我將通過該連接接收一個恆定的數據流,但我希望能夠在用戶指定的時間(如10秒)後將其剪切。 – GreenApples53

+0

@ GreenApples53好吧,我誤解了這個問題。你能否看到ConnectionKeepAliveStratergy是否有幫助?在從服務器收到第一個響應之後,您可以使用保持活動超時來處理此問題。在收到響應之前,您可以使用套接字超時來實現此目的。所以我想你需要混合兩者 –

+0

我目前實現了一個解決方案,它產生一個計時器線程,在指定的時間後簡單地中止連接。我不確定這是否是最佳做法,但它似乎對我有用。你認爲這會有什麼問題嗎?親切的問候 – GreenApples53

0

如果您使用的是DefaultHttpClient,則接受HttpParams,您可以在其中提供連接相關設置。

SO_TIMEOUT是SocketTimeout - 定義套接字超時(SO_TIMEOUT),以毫秒爲單位,即等待數據的超時值,或者換句話說,兩個連續數據包之間的最大時間間隔不活動)。

HttpParams httpParams = new BasicHttpParams(); 
httpParams.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT); 
httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT); 
DefaultHttpClient backend = new DefaultHttpClient(httpParams); 

做的更好的辦法是使用HttpClientBuilder作爲@Bandi基肖爾建議。或者使用PoolingClientConnectionManager直接使用setter接受這些設置。