2

关于各种 SO 答案的陈述似乎有些混乱和矛盾:是什么导致我的 java.net.SocketException:连接重置?. 您可以在此处看到接受的答案表明连接已被另一方关闭。但这不是真的,关闭连接不会导致连接重置。它是由“底层 TCP/IP 错误”引起的。

我想知道的是,SocketException: Connection reset除了“根本的 TCP/IP 错误”之外,是否还有其他方法。真正造成这种情况的原因是什么?因为我怀疑它与关闭的连接有什么关系(因为关闭连接不是一个值得例外的标志,并且从关闭的连接中读取是,但这不是“潜在的 TCP/IP 错误”。

我的假设是这样的

连接重置是由于服务器未能确认 ACK 数据包(完全或仅根据 TCP/IP 不正确)。并且只有在没有生成要读取的数据时才会生成 SocketTimeoutException (因为这是在一定时间后的读取过程中抛出的,并且 read 正在等待数据,但不关心 ACK 数据包)。换句话说,如果 read() 在分配的时间内没有读取任何字节的实际数据(数据层),它就会抛出 SocketTimeoutException。

4

2 回答 2

1

根据我的经验,当客户端中止请求(用户关闭选项卡或单击另一个链接)时会发生这种情况。

于 2010-04-22T15:51:21.487 回答
1

从 openjdk6 源来看,当尝试读取数据失败并出现 ECONNRESET 错误(Linux 和 Solaris)或 WSAECONNRESET(Windows)时,似乎会发出“连接重置”。

以我的经验,典型的原因是套接字另一端的一方在没有先执行关机的情况下关闭了套接字。

于 2010-04-22T22:33:07.410 回答