关于各种 SO 答案的陈述似乎有些混乱和矛盾:是什么导致我的 java.net.SocketException:连接重置?. 您可以在此处看到接受的答案表明连接已被另一方关闭。但这不是真的,关闭连接不会导致连接重置。它是由“底层 TCP/IP 错误”引起的。
我想知道的是,SocketException: Connection reset
除了“根本的 TCP/IP 错误”之外,是否还有其他方法。真正造成这种情况的原因是什么?因为我怀疑它与关闭的连接有什么关系(因为关闭连接不是一个值得例外的标志,并且从关闭的连接中读取是,但这不是“潜在的 TCP/IP 错误”。
我的假设是这样的
连接重置是由于服务器未能确认 ACK 数据包(完全或仅根据 TCP/IP 不正确)。并且只有在没有生成要读取的数据时才会生成 SocketTimeoutException (因为这是在一定时间后的读取过程中抛出的,并且 read 正在等待数据,但不关心 ACK 数据包)。换句话说,如果 read() 在分配的时间内没有读取任何字节的实际数据(数据层),它就会抛出 SocketTimeoutException。