对于下面这个错误的确切含义,我还没有找到一个合适的答案:
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();
发布于 2008-09-25 20:50:22
这通常意味着存在网络错误,例如TCP超时。我将首先在连接上放置一个嗅探器(wireshark),看看您是否能看到任何问题。如果出现TCP错误,您应该能够看到它。此外,您还可以检查路由器日志(如果适用)。如果在任何地方涉及到无线,那就是这类错误的另一个来源。
发布于 2014-04-22 20:53:03
如果您的TLS客户端无法通过配置为要求客户端身份验证的服务器进行身份验证,也会发生这种情况。
发布于 2015-03-29 05:30:25
当连接突然关闭时(当TCP连接在发送缓冲区中仍有数据时被重置时),就会发生此错误。这种情况非常类似于一种更常见的“对等重置连接”。当通过Internet连接时,它可能会零星发生,但如果时机正确,也可以系统地发生(例如,使用本地主机上的保持连接)。
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 ...
https://stackoverflow.com/questions/135919
复制相似问题