2013-06-17 10 views
5

Wenn ich ein Socket SoTimeout einstelle und von ihm lese. Wenn die Lesezeit das Zeitlimit überschreitet, erhalte ich eine "SocketTimeoutException: Read time out". und hier ist der Stapel in meinem Fall:Was ist der Unterschied zwischen "java.io.IOException: Zeitüberschreitung der Verbindung" und "SocketTimeoutException: Zeitüberschreitung beim Lesen"

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) 

aber hier traf ich "IOExcetion: Connection timed out", ich weiß nicht, wie es passiert ist. 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) 

Kann mir jemand sagen, was die Unterschiede zwischen den beiden Ausnahmen ist, Dank.

Antwort

3

Ein Verbindungs-Timeout bedeutet, dass Sie versucht haben, eine Verbindung mit dem Remote-IP/-Port-Paar herzustellen, und dies fehlgeschlagen ist: Es hat überhaupt nicht geantwortet. Ein anderer möglicher Fehler in diesem Stadium wäre die Verbindung verweigert, in der dieses Paar verfügbar ist, aber den Verbindungsversuch abgewiesen hat. Diese beiden Fehler erscheinen bei der anfänglichen Einrichtung eines Sockets. Beachten Sie, dass diese Fehler nur bei TCP auftreten, da eine TCP-Verbindung die Einrichtung einer Sitzung erfordert.

Wenn Sie ein Socket-Lese-Timeout haben, bedeutet dies, dass Sie sind verbunden, aber nicht rechtzeitig Daten gelesen. Timeouts an Sockets sind konfigurierbar. Sie können auch eine Verbindung zurückgesetzt Fehlermeldung erhalten, was bedeutet, dass die Verbindung erfolgreich hergestellt haben, aber das andere Ende entschieden, dass schließlich bist du nicht wert: p

+0

thx fge. Aber ich denke, der Stack ist ** Lesen ** nicht ** Verbinden ** in der Connection Timeout-Fall – Ekans

+0

Was "Stack"? Nein, ein Verbindungstimeout tritt auf, wenn Sie versuchen, eine Verbindung herzustellen, aber fehlschlägt. Weißt du wie TCP funktioniert? – fge

+1

ich meine Stack-Traces, fge :) die beiden Stacks zeigen Exception geworfen beim Lesen von etw nicht verbinden – Ekans

2

Einfache Antwort:

In einem Fall (Connection timed out) Ihre Anwendung kann nicht rechtzeitig mit dem Server verbinden. Im anderen Fall (Read timed out) kann die Verbindung hergestellt werden, aber während des Lesevorgangs wird die Verbindung unterbrochen.

+1

THX Plonus. Aber ich denke, die Stacks zeigen, dass es falsch ist mit dem Lesen im 'Connection Timeout'-Fall – Ekans

0

"Zeitüberschreitung der Verbindung" nach der Verbindungsphase bedeutet, dass etwas mit der Verbindung nicht richtig funktioniert hat und dass es geschlossen sein muss. 'Lese-Timeout' bedeutet nur, dass keine Daten innerhalb des angegebenen Empfangs-Timeouts angekommen sind: es ist nicht fatal.

Verwandte Themen