首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java.net.SocketException:软件导致连接中止: recv失败

java.net.SocketException:软件导致连接中止: recv失败
EN

Stack Overflow用户
提问于 2008-09-25 20:43:00
回答 10查看 324K关注 0票数 88

对于下面这个错误的确切含义,我还没有找到一个合适的答案:

java.net.SocketException: Software caused connection abort: recv failed

备注:

  • 此错误很少见且不可预测;尽管出现此错误意味着以后对URI的所有请求也将失败。
  • 唯一有效的解决方案(也是偶尔有效的)是重新启动Tomcat和/或实际的计算机(本例中为Windows)。
  • URI绝对可用(通过请求浏览器执行获取来确认)。

相关代码:

代码语言:javascript
复制
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();
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2008-09-25 20:50:22

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

票数 30
EN

Stack Overflow用户

发布于 2014-04-22 20:53:03

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

票数 28
EN

Stack Overflow用户

发布于 2015-03-29 05:30:25

当连接突然关闭时(当TCP连接在发送缓冲区中仍有数据时被重置时),就会发生此错误。这种情况非常类似于一种更常见的“对等重置连接”。当通过Internet连接时,它可能会零星发生,但如果时机正确,也可以系统地发生(例如,使用本地主机上的保持连接)。

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

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

示例用法:

代码语言:javascript
复制
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 ...
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/135919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档