java socket 连接失败_套接字 - java.net.SocketException:软件导致连接中止:recv失败...

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

这个问题在这里已有答案:

“软件导致连接中止的正式原因:套接字写入错误”                                     12个答案

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

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

grammar31 asked 2019-06-14T02:29:31Z

10个解决方案

22 votes

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

AdamC answered 2019-06-14T02:29:48Z

19 votes

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

desbocages answered 2019-06-14T02:30:12Z

8 votes

当连接突然关闭时(当发送缓冲区中仍有数据时重置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 ...

rustyx answered 2019-06-14T02:30:55Z

4 votes

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

pfranza answered 2019-06-14T02:31:20Z

3 votes

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

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

Ken answered 2019-06-14T02:31:51Z

2 votes

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

Anantharaman answered 2019-06-14T02:32:16Z

1 votes

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

Michael J. Gray answered 2019-06-14T02:32:42Z

1 votes

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

trinity answered 2019-06-14T02:33:08Z

1 votes

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

sc.setSoLinger(true, 10);

从网站复制 - >通过使用setSoLinger()方法,您可以在发送重置之前明确设置延迟,从而为读取或发送数据留出更多时间。

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

Sergio answered 2019-06-14T02:33:47Z

0 votes

如果您使用Netbeans管理Tomcat,请尝试在工具 - 服务器中禁用HTTP监视器

Maroš Košina answered 2019-06-14T02:34:13Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值