2010-06-18 174 views
107

3個問題:套接字的連接和讀取超時有什麼區別?

  1. 是什麼連接閱讀超時插座之間的區別?

  2. 什麼是連接 timeout設置爲「infinity」是什麼意思?在什麼情況下可以留在不定式循環中?什麼會觸發無限循環死亡?

  3. 什麼是閱讀超時設置爲「無窮大」是什麼意思?在什麼情況下可以留在不定式循環中?什麼會觸發無限循環死亡?

回答

135

1)什麼是連接並讀取超時插座之間的區別?

連接超時是進行初始連接的超時時間;即完成TCP連接握手。讀取超時是等待讀取數據的超時。特別是,如果服務器在最後一個字節後超過>秒的時間內未發送字節<,則會引發讀取超時錯誤。

2)連接超時設置爲「無窮大」是什麼意思?在什麼情況下可以留在不定式循環中?什麼會觸發無限循環死亡?

這意味着連接嘗試可能永遠阻塞。沒有無限循環,但嘗試連接可以被關閉套接字的另一個線程解除阻塞。 (A Thread.interrupt()電話也可以做詭計......不知道。)

3)讀取超時設置爲「無窮大」是什麼意思?在什麼情況下可以留在不定式循環中?什麼會觸發無限循環死亡?

這意味着在套接字流上調用read可能會永遠阻塞。再一次,沒有無限循環,但read可以通過調用Thread.interrupt()解除阻塞,關閉套接字,並且(當然)另一端發送數據或關閉連接。

+0

」讀取超時是等待讀取數據的超時。「你寫了「WAITING」來讀取數據?讀取超時不是可以打開套接字多長時間的時間? – corgrath 2010-06-18 12:38:57

+0

在Java中,您可以將「無限」設置爲連接並且讀取超時。我想知道這些情況會如何發生(它將處於一個不定式的循環中)。如果你說連接是用於TCP握手的,那麼等待怎麼會是不定式的?並非TCP中的所有數據包都被佔用? – corgrath 2010-06-18 12:47:24

+4

「讀取超時不是插座可以打開多長時間?」那是對的。 「並非TCP中的所有數據包都被佔用了?」超時時間表示等待另一端發送SYN-ACK以響應初始SYN數據包的時間。 – 2010-06-18 13:14:33

6

這些是由JVM爲TCP連接建立和等待從套接字讀取數據強制執行的超時值。

如果該值設置爲無窮大,則不會永遠等待。它只是意味着JVM沒有超時,操作系統將負責所有的超時。但是,操作系統的超時時間可能會很長。在一些緩慢的網絡中,我看到超時時間長達6分鐘。

即使您爲套接字設置了超時值,但如果超時發生在本機代碼中,它可能無法正常工作。我們可以通過連接到被防火牆阻止的主機或拔下交換機上的電纜來重現Linux上的問題。

處理TCP超時的唯一安全方法是在不同線程中運行連接代碼,並在線程過長時中斷線程。「

+0

「如果該值設置爲無窮大,則不會永遠等待。」 只要不是關於「無限」的意義的討論,它肯定會發生,你等待很長時間。 我們在這裏有一個案例,其中'HttpURLConnection.getResponseCode()'掛在apprx上。一個星期,直到我們重新開始這個過程。在JVM端顯然沒有超時設置,也沒有在Linux OS端超時。 – 2013-07-16 13:09:57

+0

最後一段不正確。最多一分鐘後,連接將超時。單獨的線程是完全不必要的。如果沒有數據,你當然可以擁有永久運行的*讀取*。但是,Javadoc錯誤地認爲默認連接超時是無限的。事實並非如此。 – EJP 2013-08-19 23:01:13

+1

@comeGetSome這是不正確的。您可以關閉套接字進行輸入。這會導致被阻塞的讀取遇到流結束。 – EJP 2016-11-28 02:53:22