2013-07-31 24 views
0

我正在使用基於JDK 1.4的舊庫,並且發現嘗試連接到未知網址時存在巨大超時。調查顯示下一個問題:如何覆蓋系統默認TCP超時

在JDK 1.5之前,沒有對URLConnection對象的連接超時設置。相反,它只是使用TCP超時的默認操作系統級超時值(默認情況下爲1800秒/ 30分鐘)。 JDK1.5和之後包括設置自定義超時的選項,該自定義超時覆蓋操作系統提供的默認設置。

是否可以重寫從java的'TCP超時操作系統設置'所以寫在Java 1.4上的代碼使用此設置?

回答

2

您需要調用系統命令,它會改變這你的機器上

  • 你需要root或具有sudo訪問
  • 它改變它的每個程序
  • 你需要知道什麼它適用於您支持的每個平臺。

或者您可以升級到Java 7.甚至Java 6也是行尾。

1

相反,它只會使用TCP超時(默認情況下恰好是1800秒/ 30分鐘)

這是不正確的默認操作系統級別超時值。有幾個TCP超時,但這裏適用的是連接超時,其中包括三次內部超時嘗試,如10,20,40秒,總共70秒。當然不是半個小時。事實上,我不知道任何TCP超時默認爲半小時。

是否可以重寫從java的'TCP超時OS設置'所以代碼寫在Java 1.4使用此設置?

您可以在目標系統上運行regedit或其他適當的選項,但是您將爲每個人改變它,這當然不可取。

但是,鑑於上述錯誤,我想知道你是否真的有問題。您應該能夠忍受一分鐘的默認連接超時。

0

如果您有權訪問套接字對象,則可以通過設置SO_TIMEOUT套接字選項來更改超時值。這允許您更改所有阻止調用的超時(例如connect())。它至少在1.4.2中可用。

+0

這不會影響連接超時。它會影響讀取超時。它也不會設置寫入超時。 -1 – EJP

+0

啊,對不起,我沒有看到。你/你可以改變呼叫連接嗎?我看到它有一個超時參數。或者使用類似SocketChannel的庫嗎? 如果後者,然後解壓縮套接字(套接字()),並做手動連接工程(如果我的記憶正確地服務我)。或者你有足夠的權限將socketchannel設置爲非阻塞(對於連接)? –