java.net.SocketException:软件导致连接中止:接收失败[重复]
题
这个问题在这里已经有答案了:
- “软件导致连接中止”的官方原因:套接字写入错误” 13 个答案
我无法找到以下错误的确切含义的适当答案:
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();
解决方案
这通常意味着存在网络错误,例如 TCP 超时。我首先在连接上放置一个嗅探器(wireshark),看看是否可以看到任何问题。如果存在 TCP 错误,您应该能够看到它。此外,您还可以检查路由器日志(如果适用)。如果任何地方涉及无线,那就是此类错误的另一个来源。
其他提示
如果您的 TLS 客户端无法通过配置为需要客户端身份验证的服务器进行身份验证,也会发生这种情况。
当连接突然关闭时(当发送缓冲区中仍有数据时重置 TCP 连接时)会发生此错误。这种情况与更常见的“连接被对等方重置”非常相似。通过互联网连接时,它可能会偶尔发生,但如果时机正确,也会系统性地发生(例如,在本地主机上保持活动连接)。
HTTP 客户端应该重新打开连接并重试请求。重要的是要理解,当连接处于这种状态时,除了关闭它之外没有其他方法可以摆脱它。任何发送或接收的尝试都会产生相同的错误。
不要使用 URL.open()
, ,使用 Apache-Commons Http客户端 它具有重试机制、连接池、保活等许多功能。
使用示例:
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 ...
您正在访问 http 数据吗?可以使用 HttpClient 库代替标准库吗?该库有更多选项,并将提供更好的错误消息。
我唯一一次看到类似的情况发生是当我的连接不良时,或者当有人关闭我从不同线程上下文使用的套接字时。
尝试将 'autoReconnect=true' 添加到 jdbc 连接字符串
当连接超时或远程主机终止连接(关闭应用程序、计算机关闭等)时,这种情况会时常发生。您可以通过自己管理套接字并通过其通信协议处理应用程序中的断开连接来避免这种情况,然后调用 shutdownInput
和 shutdownOutput
清理会话。
查看 http 端口上是否有其他服务或程序正在运行。当我尝试使用该端口并且它被另一个程序占用时,就发生了这种情况。
我也有这个问题。我的解决方案是:
sc.setSoLinger(true, 10);
从网站复制 --> 通过使用 setSoLinger()
方法中,您可以在发送重置之前显式设置延迟,从而为读取或发送数据提供更多时间。
也许这不是每个人的答案,而是某些人的答案。
如果您使用Netbeans管理Tomcat,请尝试在“工具”-“服务器”中禁用HTTP监视器