2014-07-03 11 views
9

Rozważmy następujący fragment:zrozumienia URLConnection.setReadTimeout()

URLConnection connection = target.openConnection(); 

connection.setConnectTimeout(5000); // 5 sec 
connection.setReadTimeout(10000); // 10 sec 

Czy connection.setReadTimeout ustawia maksymalny czas dostępny dla rozpoczęcia odczytu danych czy jest to maksymalny czas dostępne za wypełnienie danych czytać?

Moje podsumowanie polega na tym, że java ma 10 sekund na rozpoczęcie czytania następnego bajtu danych z połączenia. Nie ma limitu czasu na przeczytanie wszystkich danych z połączenia, ponieważ nie wiemy, jak duży może być strean. Czy to jest poprawne?

Odpowiedz

6

Według Dokumenty wyroczni, jeśli nie ma danych w zadanym czasie odczytu, wyjątek może być wyrzucony

SocketTimeoutException może być wyrzucony po przeczytaniu ze zwróconego strumienia wejściowej, jeśli nastąpi odczyt upływa zanim dane jest dostępny do odczytu .

6

Służy do "uruchamiania" odczytanych danych. Limit czasu służy do ustawienia limitu czasu oczekiwania na dane przychodzące. Limit czasu nie ma zastosowania, gdy dostępne są dane do odczytu.

"Jeśli limit czasu wygasa, zanim dostępne będą dane dla odczytu, podniesiony zostaje java.net.SocketTimeoutException."

Oracle Reference

W skrócie - zrozumienie jest prawidłowe.

+0

więc ten limit czasu nie może uratować nas przed atakiem jak wolne ciężarówki, prawda? – kommradHomer

5

masz rację! connection.setReadTimeout nie oznacza kompletnego odczytu, oznacza to, że po odczekaniu 10 sekund, gdy nie ma więcej danych do odczytu, wygenerowany zostanie wyjątek timeout.

Powiązane problemy