java.net.SocketException:软件导致连接中止:recv失败
我一直无法find一个适当的答案,究竟是什么下面的错误意味着:
java.net.SocketException: Software caused connection abort: recv failed
笔记:
- 这个错误是不经常的,不可预测的; 虽然得到这个错误意味着所有未来的URI请求也将失败。
- 唯一有效的解决scheme(也是偶尔)是重新启动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();
这通常意味着存在networking错误,例如TCP超时。 我会开始在连接上放置一个嗅探器(wireshark),看看你是否能看到任何问题。 如果有一个TCP错误,你应该能够看到它。 另外,如果这适用,您可以检查您的路由器日志。 如果无线涉及到任何地方,这是这类错误的另一个来源。
如果您的TLS客户端无法通过configuration为需要客户端身份validation的服务器进行身份validation,也会发生这种情况。
我唯一一次看到这样的事情发生在我连接不好的时候,或者有人closures了我正在使用的不同线程上下文的套接字。
当连接突然closures时(当发送缓冲区中仍然有数据时TCP连接被重置),会发生此错误。 该条件与更常见的“通过对等方重置连接”非常相似。 当通过互联网连接时,它可能会偶尔发生,但是如果时机正确的话(例如在本地主机上保持连接),系统也会发生。
HTTP客户端应该重新打开连接并重试请求。 当连接处于这种状态时,理解这一点很重要,除了closures连接之外,没有任何办法可以解决。 任何发送或接收的尝试都会产生相同的错误。
不要使用URL.open()
,使用具有重试机制,连接池,保持活动和许多其他function的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 ...
你在访问http数据吗? 你可以使用HttpClient库而不是标准库吗? 图书馆有更多的select,并会提供更好的错误信息。
尝试将“autoReconnect = true”添加到jdbc连接string
当连接超时或远程主机终止连接(closures应用程序,closures计算机等)时,这种情况会不时发生。 您可以通过自己pipe理套接字并通过其通信协议处理应用程序中的断开连接,然后调用shutdownInput
和shutdownOutput
来清除会话,从而避免这种情况。
看看是否有另一个服务或程序在http端口上运行。 当我尝试使用这个端口并且被另一个程序占用时,它发生在我身上。
如果您使用Netbeans来pipe理Tomcat,请尝试在Tools – Servers中禁用HTTP监视器
我也有这个问题。 我的解决scheme是:
sc.setSoLinger(true, 10);
从网站复制 – >通过使用setSoLinger()
方法,可以在发送重置之前显式设置延迟,从而为数据读取或发送提供更多的时间。
也许这不是每个人的答案,而是一些人。