2014-07-03 26 views
9

Si consideri il seguente frammento di codice:comprensione URLConnection.setReadTimeout()

URLConnection connection = target.openConnection(); 

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

Fa il connection.setReadTimeout imposta il tempo massimo a disposizione per l'avvio di leggere i dati o è il tempo massimo a disposizione per il completamento dei dati di lettura?

Il mio understaning è che con questo, java ha 10 secondi per iniziare a leggere il prossimo byte di dati dalla connessione. Non è previsto il timeout per la lettura di tutti i dati dalla connessione in quanto non sappiamo quanto grande possa essere la strean. È corretto?

risposta

6

Secondo documenti di Oracle, se non sono disponibili dati per il periodo di lettura di timeout, ad eccezione possono essere gettati

Un SocketTimeoutException può essere lanciato durante la lettura dal flusso di di input restituito se il timeout di lettura scade prima che i dati è disponibile per letto.

6

È per "avviare" i dati letti. Il timeout è lì per impostare un limite sulla durata dell'attesa per i dati in arrivo. Il timeout non si applica quando sono disponibili dati per la lettura.

"Se il timeout scade prima che siano disponibili i dati per la lettura, viene generato un numero java.net.SocketTimeoutException".

Oracle Reference

In breve - la vostra comprensione è corretta.

+0

quindi questo timeout non può salvarci da un attacco come camion lenti, giusto? – kommradHomer

5

hai ragione! connection.setReadTimeout non significa leggere completo, significa che quando si attende 10 secondi, quando non ci sono più dati letti, verrà lanciata una eccezione timeout.