我的java.net.SocketException: Connection reset是什么原因引起的?

156
我们的日志中经常出现间歇性的 java.net.SocketException: Connection reset 错误。我们不确定实际发生 Connection reset 错误的原因,并且也不知道如何进行调试。
该问题似乎与我们尝试发送的消息无关。 请注意,该消息不是 connection reset by peer
您有关于这个异常的典型原因和我们应该如何处理的任何建议吗?
以下是代表性的堆栈跟踪(com.companyname.mtix.sms 是我们的组件):
java.net.SocketException: Connection reset
在java.net.SocketInputStream.read(SocketInputStream.java:168)中出现问题,
在java.io.BufferedInputStream.fill(BufferedInputStream.java:218)中填充数据时出错,
在java.io.BufferedInputStream.read(BufferedInputStream.java:235)中读取数据时出错,
在org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:77)中读取原始行时出错,
在org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:105)中读取行时出错,
在org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1115)中读取响应状态行时出错,
在org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1832)中读取响应状态行时出错,
在org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1590)中读取响应时出错,
在org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:995)中执行HTTP方法时出错,
在org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397)中执行HTTP方法时出错,
在org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)中执行HTTP方法时出错,
在org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)中执行HTTP方法时出错,
在org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)中执行HTTP方法时出错,
在com.companyname.mtix.sms.services.impl.message.SendTextMessage.sendTextMessage(SendTextMessage.java:127)中发送短信时出错,
在com.companyname.mtix.sms.services.MessageServiceImpl.sendTextMessage(MessageServiceImpl.java:125)中发送短信时出错,
在com.companyname.mtix.sms.services.remote.MessageServiceRemoteImpl.sendTextMessage(MessageServiceRemoteImpl.java:43)中发送短信时出错,
在sun.reflect.GeneratedMethodAccessor203.invoke(Unknown Source)中调用方法时出错,
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中调用方法时出错,
在java.lang.reflect.Method.invoke(Method.java:585)中调用方法时出错,
在org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397)中调用方法时出错,
在org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186)中处理消息时出错,
在org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323)中调用方法时出错,
在org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)中访问时出错,
在org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)中访问时出错,
在org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)中调用时出错,
在org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:453)中调用SOAP服务时出错,
在org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)中调用Axis服务器时出错,
在org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699)中进行POST请求时出错,
在javax.servlet.http.HttpServlet.service(HttpServlet.java:709)中提供HTTP服务时出错,
在org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)中提供HTTP服务时出错,
在javax.servlet.http.HttpServlet.service(HttpServlet.java:802)中提供HTTP服务时出错,
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)中过滤请求时出错,
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)中过滤请求时出错,
在com.companyname.mtix.sms.http.filters.NoCacheFilter.doFilter(NoCacheFilter.java:63)中过滤请求时出错,
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)中过滤请求时出错,
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)中过滤请求时出错,
在com.companyname.mtix.sms.http.filters.MessageFilter.doFilter(MessageFilter.java:53)中过滤请求时出错,
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)中过滤请求时出错,
在org.apache我们的组件是一个在Tomcat下运行的Web应用程序,调用第三方Web服务发送短信,它偶然发生。异常抛出的代码行是下面代码片段中的最后一行。

我们的组件是一个 Web 应用程序,在 Tomcat 下运行,调用第三方 Web 服务发送 SMS 消息,偶尔会出现异常。代码片段中异常抛出的那一行是最后一行。

String aggregatorResponse = null;
HttpClient httpClient = prepareHttpClient( username, password );
PostMethod postMethod = preparePostMethod( textUrl );

try {
  SybaseTextMessageBuilder builder = new SybaseTextMessageBuilder();
  URL notifyUrl = buildNotificationUrl( textMessage, codeSetManager );
  String smsRequestDocument = builder.buildTextMessage( textMessage, notifyUrl );
  LOG.debug( "Sybase MT document created as: \n" + smsRequestDocument );

  postMethod.setRequestEntity( new StringRequestEntity( smsRequestDocument ) );
  LOG.debug( "commiting SMS to aggregator: " + textMessage.toString() );
  int httpStatus = httpClient.executeMethod( postMethod );

2
从完整的堆栈中可以看出,它始于“读取”操作。你的客户端已经离开,但你仍然尝试从它的流中读取。请参考我的ServerSocket解决方案:https://dev59.com/y3VD5IYBdhLWcg3wKoWH#31741436。 - Davut Gürbüz
1
对于在使用Go时遇到此问题的人,https://github.com/golang/go/issues/50984 此问题将导致“连接重置”,因为在“http.Do”完成后握手过程中多余的TLS连接被关闭。 - Kassian Sun
14个回答

0

顺便说一句,当我无意中向期望POST请求的端点发出GET请求时,就会出现这个错误。大概那只是特定服务器处理问题的方式。


0

当我尝试读取的文本文件包含与我们防火墙上的杀毒软件签名匹配的字符串时,我遇到了这个错误。


-1

我之所以遇到这个错误,是因为我尝试连接的端口被关闭了。


3
那会引起连接超时或连接拒绝。 - user207421

-1
我也遇到了完全相同的错误:Connection reset by peer。异常是在运行postForObject()方法时由Spring的REST模板引发的。对于我来说,问题是HTTP URL请求太长了。因此,首先请检查生成的URL是否符合要求,如果您的服务器真的应该能够处理那么长的请求,请去服务器配置并提高URL请求的默认允许长度。

这对我解决了问题,但要注意:应用程序可能无法在某些互联网浏览器上运行,特别是旧版本,因为它们具有固定的URL请求最大长度。

希望能帮到你...


12
“Connection reset” 不等同于 “Connection reset by peer”。 - OrangeDog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接