149

我们在日志中看到频繁但间歇性 java.net.SocketException: Connection reset的错误。我们不确定Connection reset错误实际上来自哪里,以及如何进行调试。

该问题似乎与我们尝试发送的消息无关。请注意,该消息不是 connection reset by peer.

有关此异常的典型原因可能是什么以及我们如何进行的任何建议?

这是一个有代表性的堆栈跟踪(com.companyname.mtix.sms是我们的组件):

    java.net.SocketException:连接重置
        在 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)
        在 org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397)
        在 org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)
        在 org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
        在 org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)
        在 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(未知来源)
        在 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)
        在 org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)
        在 org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699)
        在 javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        在 org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
        在 javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        在 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.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:61)
        在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
        在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        在 org.ajaxanywhere.AAFilter.doFilter(AAFilter.java:46)
        在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
        在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        在 org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        在 org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        在 org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        在 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        在 java.lang.Thread.run(Thread.java:595)
    

我们的组件是一个 Web 应用程序,在 Tomcat 下运行,它调用发送 SMS 消息的第三方 Web 服务,它就是这样发生的。引发异常的代码行是下面代码片段的最后一行。

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

14 回答 14

66

SocketException 的 javadoc 声明它是

抛出表示底层协议有错误,例如 TCP 错误

在您的情况下,连接的服务器端似乎已关闭连接。这可能是您发送的请求的问题或最终的问题。

为了帮助调试,您可以使用诸如Wireshark之类的工具来查看实际的网络数据包。此外,是否有可用于测试 Web 服务的 Java 代码的替代客户端?如果此操作成功,则可能表明 Java 代码中存在错误。

当您使用 Commons HTTP Client 时,请查看Common HTTP Client Logging Guide。这将告诉您如何在 HTTP 级别记录请求。

于 2009-02-25T11:30:57.110 回答
51

这个错误发生在你这边而不是另一边。如果对方重置连接,那么异常消息应该说:

java.net.SocketException reset by peer

原因是内部连接HttpClient陈旧。检查 SSL 的陈旧连接不能修复此错误。解决方案:转储您的客户端并重新创建。

于 2009-07-29T01:39:01.757 回答
18

如果您在尝试访问部署在 Glassfish3 服务器上的 Web 服务时遇到这种情况,您可能需要调整您的 http-thread-pool 设置。修复了当许多并发线程调用 Web 服务时我们遇到的 SocketExceptions。

  1. 转到管理控制台
  2. 导航到“配置”->“服务器配置”->“线程池”->“http-thread-pool”。
  3. 将设置“最大线程池大小”从 5 更改为 32
  4. 将设置“最小线程池大小”从 2 更改为 16
  5. 重新启动 Glassfish。
于 2011-10-21T10:41:23.563 回答
12

我也偶然发现了这个错误。就我而言,问题是我使用的是 JRE6,它支持TLS1.0。服务器只支持 TLS1.2,所以抛出了这个错误。

于 2014-08-28T12:07:58.707 回答
9

在我的情况下,这是因为我的 Tomcat 设置不足,无法maxHttpHeaderSize满足特别复杂的 SOLR 查询。

希望这可以帮助那里的人!

于 2013-01-22T19:17:05.710 回答
5

我一直收到这个错误并认为它是正常的。

当另一方已经挂断时一方试图阅读时,就会发生这种情况。因此,根据协议,这可能会或可能不会指定一个问题。如果我的客户端代码明确向服务器表明它将挂断,那么客户端和服务器都可以同时挂断,并且不会发生此消息。

我实现代码的方式是让客户直接挂断而不说再见。然后服务器可以捕获错误并忽略它。在 HTTP 的上下文中,我相信协议的一个级别允许每个连接一个以上的请求,而另一个不允许。

因此,您可以看到一方有可能继续挂断另一方。我怀疑您收到的错误是否存在任何盗版问题,您可以简单地抓住它以防止它填满您的日志文件。

于 2010-06-27T22:36:13.930 回答
4

当客户端在通过套接字返回响应之前关闭套接字连接时,服务器端会发生此错误。在 Web 应用场景中,并非所有这些都是危险的,因为它们可以手动创建。例如,在检索到响应之前退出浏览器。

于 2009-02-25T11:35:41.730 回答
2

异常意味着套接字从另一端意外关闭。由于您正在调用 Web 服务,因此不应该发生这种情况 - 很可能您发送的请求会触发 Web 服务中的错误。

尝试在这些情况下记录整个请求,看看是否发现任何异常。否则,请与网络服务提供商联系并将您记录的有问题的请求发送给他们。

于 2009-02-25T11:23:53.397 回答
1

我知道这个线程有点旧,但想加我的 2 美分。在我们发布其中一个版本之后,我们立即遇到了相同的“连接重置”错误。

根本原因是,我们的apache服务器因部署而停机。我们所有的第三方流量都通过apache,并且由于连接中断,我们遇到了连接重置错误。

于 2016-09-14T12:19:58.597 回答
1

java.net.SocketException: Connection reset这是一个旧线程,但我昨天遇到了。

服务器端应用程序的限制设置已更改为一次只允许 1 个连接!因此,有时电话会通过,有时不会。我通过更改节流设置解决了这个问题。

于 2018-10-05T03:21:13.167 回答
0

当我尝试读取的文本文件包含与防火墙上的防病毒签名匹配的字符串时,我收到此错误。

于 2017-11-05T20:31:07.363 回答
0

FWIW,当我不小心向期望 POST 请求的端点发出 GET 请求时,我收到了这个错误。据推测,这只是处理问题的特定服务器方式。

于 2018-10-12T09:04:34.320 回答
-1

我也得到了这个错误:Connection reset by peer。Spring 的 REST 模板在运行该postForObject()方法时引发了异常。对我来说,问题是 HTTP URL 请求太长。所以首先检查生成的 URL 是否是它应该是的,如果你的服务器真的应该能够处理该长度的请求,只需转到服务器的配置并提高 URL 请求的默认允许长度。

这解决了我的问题,但请注意:该应用程序可能无法在某些 Internet 浏览器上运行,尤其是旧浏览器,因为它们具有固定的最大 URL 请求长度。

希望能帮助到你...

于 2011-09-28T14:40:41.790 回答
-1

我收到此错误是因为我尝试连接的端口已关闭。

于 2018-11-28T22:04:34.137 回答