Java:清除导致连接重置的原因的混乱

时间:2010-04-22 15:48:04

标签: java tcp ioexception

似乎存在一些混淆以及与各种SO答案相矛盾的陈述:What's causing my java.net.SocketException: Connection reset?。您可以在此处看到,已接受的答案表明连接已被另一方关闭。但事实并非如此,关闭连接不会导致连接重置。它受到“底层TCP / IP错误”的警告。

我想知道的是SocketException: Connection reset是否真的意味着“无视TCP / IP错误”。究竟是什么原因造成的我怀疑它与关闭的连接有什么关系(因为关闭连接不是一个值得注意的标志,并且从封闭连接读取,但这不是“底层TCP / IP错误。”

我的假设是这个

连接重置是由于服务器无法确认ACK数据包(完全或根据TCP / IP不正确)引起的。并且只有在没有生成数据 读取时才会生成SocketTimeoutException(因为在一段时间后读取期间会抛出此数据,并且读取正在等待数据,但是不关心ACK数据包)。换句话说,如果read()在指定的时间内没有读取任何实际数据字节(DATA LAYER),则会抛出SocketTimeoutException。

2 个答案:

答案 0 :(得分:2)

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

根据我的经验,典型的原因是套接字另一端的一方在没有先关闭套接字的情况下关闭套接字。

答案 1 :(得分:1)

根据我的经验,当客户端中止请求(用户关闭标签页或点击其他链接)时会发生这种情况。