5

如果我设置一个套接字 SoTimeout,并从中读取。当读取时间超过超时限制时,我会得到一个“SocketTimeoutException:读取超时”。这是我的情况下的堆栈:

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)

但是在这里我遇到了“IOExcetion:连接超时”,我不知道它是怎么发生的。堆栈:

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)

谁能告诉我这两个例外有什么区别,谢谢。

4

3 回答 3

4

连接超时意味着您尝试连接到远程 IP/端口对但未能这样做:它根本没有响应。该阶段的另一个可能错误是连接被拒绝,其中这对可用但拒绝了您的连接尝试。这两个错误都出现在套接字的初始设置中。请注意,这些错误只发生在 TCP 上,因为 TCP 连接需要建立会话。

当你有一个套接字读取超时,这意味着你已经连接,但未能及时读取数据。套接字上的超时是可配置的。您可能还会收到连接重置错误,这意味着您确实连接成功,但另一端认为毕竟您不值得:p

于 2013-06-17T12:47:32.157 回答
3

简单的回答:

在一种情况下 ( Connection timed out),您的应用程序无法及时连接到服务器。在另一种情况下 ( Read timed out) 可以建立连接,但在读取期间连接超时。

于 2013-06-17T12:48:48.697 回答
0

'Connection timed out' after the connect phase means that something has gone seriously wrong with the connection and it must be closed. 'Read timeout' just means that no data arrived within the specified receive timeout period: it isn't fatal.

于 2013-06-17T22:08:11.040 回答