我无法找到以下错误的确切含义的充分答案:
java.net.SocketException: Software caused connection abort: recv failed
注意:
相关代码:
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();
答案 0 :(得分:22)
这通常意味着存在网络错误,例如TCP超时。我首先在连接上放置一个嗅探器(wireshark),看看你是否能看到任何问题。如果存在TCP错误,您应该能够看到它。此外,如果适用,您可以检查路由器日志。如果在任何地方都涉及无线,那么这就是造成这类错误的另一个原因。
答案 1 :(得分:20)
如果您的TLS客户端无法通过配置为需要客户端身份验证的服务器进行身份验证,也会发生这种情况。
答案 2 :(得分:10)
当连接突然关闭时(当发送缓冲区中仍有数据时重置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 ...
答案 3 :(得分:4)
我唯一一次看到类似这样的事情就是当我连接错误,或者当某人正在关闭我在不同线程上下文中使用的套接字时。
答案 4 :(得分:3)
您是否正在访问http数据?你能使用HttpClient库而不是标准库吗?该库有更多选项,可以提供更好的错误消息。
答案 5 :(得分:2)
尝试将'autoReconnect = true'添加到jdbc连接字符串
答案 6 :(得分:1)
当连接超时或远程主机终止其连接(关闭应用程序,计算机关闭等)时,这将不时发生。您可以通过自己管理套接字并通过其通信协议处理应用程序中的断开连接,然后调用shutdownInput
和shutdownOutput
来清除会话来避免这种情况。
答案 7 :(得分:1)
查看您是否在http端口上运行了其他服务或程序。当我尝试使用该端口时它发生在我身上,它被另一个程序占用。
答案 8 :(得分:1)
我也有这个问题。我的解决方案是:
sc.setSoLinger(true, 10);
从网站复制 - >通过使用setSoLinger()
方法,您可以在发送重置之前明确设置延迟,从而为读取或发送数据留出更多时间。
也许这不是每个人的答案,而是某些人的答案。
答案 9 :(得分:0)
如果您使用Netbeans管理Tomcat,请尝试在工具 - 服务器
中禁用HTTP监视器