java.net.SocketException:软件导致连接中止:recv 失败 [重复]
Posted
技术标签:
【中文标题】java.net.SocketException:软件导致连接中止:recv 失败 [重复]【英文标题】:java.net.SocketException: Software caused connection abort: recv failed [duplicate] 【发布时间】:2010-09-13 05:59:55 【问题描述】:对于以下错误的确切含义,我无法找到适当的答案:
java.net.SocketException: Software caused connection abort: recv failed
注意事项:
此错误不常见且不可预测;尽管收到此错误意味着将来所有对 URI 的请求也将失败。 唯一可行的解决方案(也只是偶尔)是重新启动 Tomcat 和/或实际机器(在本例中为 Windows)。 URI 绝对可用(通过要求浏览器进行提取来确认)。相关代码:
BufferedReader reader;
try
URL url = new URL(URI);
reader = new BufferedReader(new InputStreamReader(url.openStream())));
catch( MalformedURLException e )
throw new IOException("Expecting a well-formed URL: " + e);
//end try: Have a stream
String buffer;
StringBuilder result = new StringBuilder();
while( null != (buffer = reader.readLine()) )
result.append(buffer);
//end while: Got the contents.
reader.close();
【问题讨论】:
你好。您将答案标记为正确 - 您是否有机会通过嗅探记住发现了什么?这个问题困扰了我。 (见我的问题***.com/questions/6772215/…) 我也有这个问题。唯一的解决方案是重新启动整个机器。谁有完整的答案? @KevinWong 解决办法是修复网络。 @EJP 有点有趣的是,“之前问过”的问题是在这个问题两年后问的:-) 【参考方案1】:这通常意味着存在网络错误,例如 TCP 超时。我会首先在连接上放置一个嗅探器(wireshark),看看你是否能发现任何问题。如果有 TCP 错误,您应该能够看到它。此外,如果适用,您可以检查您的路由器日志。如果在任何地方都涉及到无线,那就是此类错误的另一个来源。
【讨论】:
【参考方案2】:如果您的 TLS 客户端无法通过配置为需要客户端身份验证的服务器进行身份验证,也会发生这种情况。
【讨论】:
不,它没有。这会导致服务器使用 TLSclose_notify
正确关闭连接。根本没有重置,或者充其量是“对等方重置连接”。
身份验证失败时,某些 API 确实发生在我身上。所以谢谢@desbocages。
这是我的 apache 设置出错的原因
当连接到需要相互身份验证的 Apache Tomcat 7.0.42 服务器时,我在尝试使用其信任链不在 Tomcat 提供的受信任证书列表中的证书进行身份验证时收到此确切错误SSL 握手。顺便说一句,我用来验证的证书在信任列表中,但它的信任链不在,这个错误仍然发生。
我得到“java.net.SocketException:软件导致连接中止:recv failed”客户端并检查了服务器端(Apache HTTPD)日志文件并看到“证书验证:错误(10):证书有已到期”。配置了相互身份验证,并且我的客户端证书已过期。令人失望的客户无法获得更具说服力的错误消息。【参考方案3】:
当连接突然关闭时会发生此错误(当 TCP 连接被重置而发送缓冲区中仍有数据时)。这种情况与更常见的“对等连接重置”非常相似。通过 Internet 连接时可能会偶尔发生这种情况,但如果时机合适(例如,在 localhost 上使用保持活动连接),也可能会系统地发生。
HTTP 客户端应该重新打开连接并重试请求。重要的是要了解,当连接处于这种状态时,除了关闭它之外别无他法。任何发送或接收的尝试都会产生同样的错误。
不要使用URL.open()
,使用Apache-Commons HttpClient,它有重试机制、连接池、keep-alive 和许多其他功能。
示例用法:
HttpClient httpClient = HttpClients.custom()
.setConnectionTimeToLive(20, TimeUnit.SECONDS)
.setMaxConnTotal(400).setMaxConnPerRoute(400)
.setDefaultRequestConfig(RequestConfig.custom()
.setSocketTimeout(30000).setConnectTimeout(5000).build())
.setRetryHandler(new DefaultHttpRequestRetryHandler(5, true))
.build();
// the httpClient should be re-used because it is pooled and thread-safe.
HttpGet request = new HttpGet(uri);
HttpResponse response = httpClient.execute(request);
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// handle response ...
【讨论】:
不,它没有。这会导致“对等方重置连接”。 OP的错误不是编程引起的。 是的。我建议你在给-1之前做一些研究。我们确实做到了。 “连接重置”是由 TCP RST 数据包引起的,但是当发送缓冲区中仍有数据时接收到 TCP RST 时,来自应用程序的后续recv()
将导致WSAECONNABORTED
错误,这会转化为异常题。我想知道 your 对此异常的解释是什么。你说的“修复网络”——我可以用几行代码在 localhost 上重现它。
您仍在将“连接重置”与“软件导致的连接中止”混为一谈。它们是两种不同的条件。
我给你解释一下,为什么你还执着于这些错误代码的一些更深层次的语义? “软件导致连接中止”是错误代码的一个荒谬名称,但它的意思正是它所说的,只是它并不意味着 您的 软件,它意味着 WinSock 软件。没有应用程序明确关闭连接然后对其执行recv()
,这将是一个简单的修复,不是吗。
老实说,到目前为止,我还没有听到你谈论任何实质性的事情。只有火焰和“-1”。做一些研究,也许你会知道 WinSock、recv 和 TCP RST 在这种情况下的作用。【参考方案4】:
您正在访问 http 数据吗?你可以使用 HttpClient 库而不是标准库吗?该库有更多选项,并且会提供更好的错误消息。
http://hc.apache.org/httpclient-3.x/
【讨论】:
【参考方案5】:我见过这样的事情发生的唯一一次是当我有一个坏的连接,或者当有人从不同的线程上下文中关闭我正在使用的套接字时。
【讨论】:
【参考方案6】:尝试将 'autoReconnect=true' 添加到 jdbc 连接字符串
【讨论】:
【参考方案7】:当连接超时或远程主机终止其连接(关闭的应用程序、计算机关闭等)时,会不时发生这种情况。您可以通过自己管理套接字并通过其通信协议处理应用程序中的断开连接,然后调用 shutdownInput
和 shutdownOutput
来清除会话来避免这种情况。
【讨论】:
【参考方案8】:查看是否有其他服务或程序在 http 端口上运行。当我尝试使用该端口并被另一个程序占用时,它发生在我身上。
【讨论】:
【参考方案9】:如果您使用 Netbeans 管理 Tomcat,请尝试在工具 - 服务器中禁用 HTTP 监视器
【讨论】:
【参考方案10】:我也有这个问题。我的解决方案是:
sc.setSoLinger(true, 10);
从网站复制 -->通过使用setSoLinger()
方法,您可以在发送重置之前显式设置延迟,从而为读取或发送数据留出更多时间。
也许这不是每个人的答案,而是某些人的答案。
【讨论】:
这是不正确的。 SO_LINGER 不会做任何这样的事情。它控制close()
阻塞多长时间(如果有的话)。它与重置的时间无关。并且“从网站复制”不是正确的引用形式。您应该提供链接,以便我们可以看到它的真实含义,并在必要时在此处发表负面评论。我知道where you got that from,从头到尾都是A级胡言乱语。大约 15 年前,我给他发了一大堆更正:他大发脾气,从那以后就没有更新过。以上是关于java.net.SocketException:软件导致连接中止:recv 失败 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
是啥导致我的 java.net.SocketException:连接重置? [复制]
如何修复 java.net.SocketException:损坏的管道?
Java 1.6 HttpsURLConnection:java.net.SocketException:连接重置
java.net.SocketException:recvfrom 失败:ETIMEDOUT(连接超时)