2017-08-04 100 views
-1

是否有任何方法可以爲JDK stdlib HttpUrlConnection設置套接字級選項(如SO_KEEPALIVE)?我試圖找出一種方法來獲取不受偶然「掛起」連接影響的HTTP請求(這似乎是因爲經常發生網絡包丟失而發生的)。更健壯的HTTP客戶端。我知道有setReadTimeout方法,但我試圖找到一些東西來推動TCP流回到生活中,而不是僅僅中止它,因爲讀取超時似乎。或者至少報告連接失敗已經發生,而不是永遠停留在讀取上。但是,如果連接「仍處於活動狀態」,那麼讀數也會「隨時想要」回來。HttpUrlConnection如何設置SO_KEEPALIVE

通過一些檢查,似乎SO_KEEPALIVE的默認值對於C層和Java級別套接字都是「關閉」的。

+1

你是否結婚了使用HttpUrlConnection? Apache的HttpClient可能有你正在尋找的東西。 [HttpClient](https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/) – drelliot

+0

@drelliot我猜你是對的,隨時讓它成爲答案,我會接受它:) – rogerdpack

回答

1

  1. SO_KEEPALIVE不會'推遲TCP流回生命',儘管它的名字很差。它僅在兩小時的默認時間間隔後檢測無效連接。這不是你要找的。

  2. 讀取超時不會中止連接。它拋出一個SocketTimeoutException。連接仍然存在,隨後的讀取可能會成功。

  3. 丟棄的數據包在TCP中被檢測到並重新發送。

使用讀取超時。

+0

我曾希望SO_KEEPALIVE將是週期性的,並以某種方式警告對方「我沒有得到你的最後一個數據包,重新發送它!」但似乎很少發生,另一方可能已經切斷了連接。這就是說,至少發送方會通過重置進行響應以通知「嘿,這根管子壞了!」所以就像你說的設置一個(大)讀取超時將「和使用SO_KEEPALIVE一樣好」用於我的場景。但是,如果我想要非常長的讀取仍然成功(或避免中間路由器上的活躍超時),我仍然可能需要SO_KEEPALIVE,是的? :) – rogerdpack

+0

@rogerdpack號SO_KEEPALIVE不會做你的想法。 – EJP

+0

是的,看起來我最初的希望是「生病了」,或許你錯讀了或誤解了我的評論?我在說我現在看到它沒有做到我所希望的,但在某些情況下可能還有其他用途。乾杯! – rogerdpack

-2

顯然,答案是「使用不同的HTTP客戶端庫比標一體」這是建立在沒有一個而是三個謬誤

相關問題