2013-06-17 5 views
5

Se si imposta un socket SoTimeout e si legge da esso. quando il tempo di lettura supera il limite di timeout, ricevo un "SocketTimeoutException: Read time out". e qui è la pila nel mio caso:Qual è la differenza tra "java.io.IOException: Timeout di connessione" e "SocketTimeoutException: Read timeout"

java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:150) 
    at java.net.SocketInputStream.read(SocketInputStream.java:121) 
    at java.io.FilterInputStream.read(FilterInputStream.java:133) 
    at org.apache.hadoop.ipc.Client$Connection$PingInputStream.read(Client.java:277) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:254) 
    at java.io.DataInputStream.readInt(DataInputStream.java:387) 
    at org.apache.hadoop.ipc.Client$Connection.receiveResponse(Client.java:527) 
    at org.apache.hadoop.ipc.Client$Connection.run(Client.java:462) 

ma qui ho incontrato "IOExcetion: connessione scaduta", non so come sia successo. Stacks:

java.io.IOException: Connection timed out 
    at sun.nio.ch.FileDispatcher.read0(Native Method) 
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:21) 
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:198) 
    at sun.nio.ch.IOUtil.read(IOUtil.java:171) 
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:245) 
    at org.apache.hadoop.net.SocketInputStream$Reader.performIO(SocketInputStream.java:55) 
    at org.apache.hadoop.net.SocketIOWithTimeout.doIO(SocketIOWithTimeout.java:142) 
    at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:155) 
    at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:128) 
    at java.io.FilterInputStream.read(FilterInputStream.java:116) 
    at org.apache.hadoop.ipc.Client$Connection$PingInputStream.read(Client.java:277) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:237) 
    at java.io.DataInputStream.readInt(DataInputStream.java:370) 
    at org.apache.hadoop.ipc.Client$Connection.receiveResponse(Client.java:527) 
    at org.apache.hadoop.ipc.Client$Connection.run(Client.java:462) 

Qualcuno può dirmi qual è la differenza tra i due eccezioni, grazie.

risposta

3

Un timeout della connessione significa che si è tentato di connettersi alla coppia IP/porta remota e non è riuscito a farlo: non ha risposto affatto. Un altro possibile errore in questa fase sarebbe la connessione rifiutata, in cui questa coppia è disponibile ma ha respinto il tentativo di connessione. Entrambi questi errori vengono visualizzati nella configurazione iniziale di un socket. Si noti che questi errori si verificano solo con TCP, dal momento che una connessione TCP richiede l'istituzione di una sessione.

Quando si dispone di un timeout di lettura socket, significa che è connesso a ma non è riuscito a leggere i dati in tempo. I timeout sulle prese sono configurabili. Puoi anche avere un errore di reset del collegamento, il che significa che si è collegato con successo, ma dall'altra parte ha deciso che, dopo tutto quello che non ne vale la pena: p

+0

thx fge. Ma penso che lo stack sia ** leggendo ** non ** collegando ** nel caso di timeout della connessione – Ekans

+0

Cosa "stack"? No, il timeout della connessione si verifica quando si tenta _ttempt_ di connettersi ma fallisce. Sai come funziona il TCP? – fge

+1

intendo tracce dello stack, fge :) le due pile mostrano Exception generata mentre sth non si connette – Ekans

2

Risposta semplice:

In un caso (Connection timed out) la tua l'applicazione non può connettersi al server in modo tempestivo. Nell'altro caso (Read timed out) è possibile stabilire la connessione ma durante la lettura la connessione scade.

+1

THON Plonus. Ma penso che gli stack mostrino che è sbagliato con la lettura nella cartella "Connection time out" – Ekans

0

'Connessione scaduta' dopo la fase di connessione indica che qualcosa è andato storto seriamente con la connessione e deve essere chiuso. 'Leggi il timeout' significa semplicemente che nessun dato è arrivato entro il periodo di timeout di ricezione specificato: non è fatale.