1) Jaka jest różnica między czasem połączenia a czasem oczekiwania dla gniazd?
Limit czasu połączenia jest limitem czasu na nawiązanie pierwszego połączenia; tzn. zakończenie uzgadniania połączenia TCP. Limit czasu odczytu to limit czasu oczekiwania na odczyt danych 1 . W szczególności, jeśli serwer nie wyśle bajtu <limit czasu> sekund po ostatnim bajcie, pojawi się błąd przekroczenia limitu odczytu.
2) Co oznacza limit czasu połączenia ustawiony na „nieskończoność”? W jakiej sytuacji może pozostać w bezokoliczniku? i co może spowodować śmierć pętli nieskończoności?
Oznacza to, że próba połączenia może potencjalnie zablokować na zawsze. Nie ma nieskończonej pętli, ale próbę połączenia można odblokować przez inny wątek zamykający gniazdo. ( Thread.interrupt()
Połączenie może również załatwić sprawę ... nie jestem pewien.)
3) Co oznacza limit czasu odczytu ustawiony na „nieskończoność”? W jakiej sytuacji może pozostać w nieskończonej pętli? Co może spowodować zakończenie nieskończonej pętli?
Oznacza to, że wywołanie read
w strumieniu gniazda może zostać zablokowane na zawsze. Ponownie nie ma nieskończonej pętli, ale read
można ją odblokować przez Thread.interrupt()
połączenie, zamknięcie gniazda i (oczywiście) drugi koniec wysyłania danych lub zamykania połączenia.
1 - To nie jest ... jak pomyślał jeden z komentatorów ... limit czasu, przez jaki gniazdo może być otwarte lub bezczynne.
HttpURLConnection.getResponseCode()
wisiał na apprx. tydzień, dopóki nie uruchomimy ponownie procesu. Po stronie JVM najwyraźniej nie ustawiono limitu czasu, a po stronie systemu operacyjnego Linux - limit czasu.Socket.shutdownInput()
bez trzymania ręki? Uwaga: Te limity czasu są wymuszane przez TCP, a nie JVM.