88

对于以下错误的确切含义,我无法找到适当的答案:

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();
4

10 回答 10

30

这通常意味着存在网络错误,例如 TCP 超时。我会首先在连接上放置一个嗅探器(wireshark),看看你是否能看到任何问题。如果有 TCP 错误,您应该能够看到它。此外,如果适用,您可以检查您的路由器日志。如果在任何地方都涉及无线,那是此类错误的另一个来源。

于 2008-09-25T20:50:21.617 回答
29

如果您的 TLS 客户端无法通过配置为需要客户端身份验证的服务器进行身份验证,也会发生这种情况。

于 2014-04-22T12:53:03.160 回答
11

当连接突然关闭时会发生此错误(当 TCP 连接重置而发送缓冲区中仍有数据时)。这种情况与更常见的“对等连接重置”非常相似。当通过 Internet 连接时,它可能会偶尔发生,但如果时机合适,也会系统地发生(例如,在 localhost 上使用保持活动连接)。

HTTP 客户端应该重新打开连接并重试请求。重要的是要了解,当连接处于这种状态时,除了关闭它之外别无他法。任何发送或接收的尝试都会产生相同的错误。

不要使用,使用具有重试机制、连接池、保持活动和许多其他功能的URL.open()Apache-Commons HttpClient 。

示例用法:

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 ...
于 2015-03-28T21:30:25.160 回答
4

你在访问http数据吗?您可以使用 HttpClient 库而不是标准库吗?该库有更多选项,并将提供更好的错误消息。

http://hc.apache.org/httpclient-3.x/

于 2008-09-25T20:49:26.360 回答
4

我唯一一次看到这样的事情发生是当我有一个坏的连接,或者当有人从不同的线程上下文中关闭我正在使用的套接字时。

于 2008-09-25T20:49:56.063 回答
2

尝试将 'autoReconnect=true' 添加到 jdbc 连接字符串

于 2011-12-28T06:54:00.053 回答
1

当连接超时或远程主机终止其连接(关闭的应用程序、计算机关闭等)时,会不时发生这种情况。您可以通过自己管理套接字并通过其通信协议处理应用程序中的断开连接,然后调用shutdownInputshutdownOutput清除会话来避免这种情况。

于 2012-04-20T12:32:40.320 回答
1

查看是否有其他服务或程序在 http 端口上运行。当我尝试使用该端口并被另一个程序占用时,它发生在我身上。

于 2012-08-24T14:59:30.713 回答
0

如果您使用 Netbeans 管理 Tomcat,请尝试在 Tools - Servers 中禁用 HTTP 监视器

于 2013-11-11T11:15:18.150 回答
0

我也有这个问题。我的解决方案是:

sc.setSoLinger(true, 10);

从网站复制 --> 通过使用该setSoLinger()方法,您可以在发送复位之前显式设置延迟,从而为读取或发送数据提供更多时间。

也许这不是每个人的答案,而是某些人的答案。

于 2014-08-25T05:55:06.210 回答