是什么导致我的java.net.SocketException:连接重置?

时间:2009-02-25 11:07:06

标签: java sockets socketexception connection-reset

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

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

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

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


    java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:235)
        at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:77)
        at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:105)
        at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1115)
        at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1832)
        at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1590)
        at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:995)
        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397)
        at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)
        at com.companyname.mtix.sms.services.impl.message.SendTextMessage.sendTextMessage(SendTextMessage.java:127)
        at com.companyname.mtix.sms.services.MessageServiceImpl.sendTextMessage(MessageServiceImpl.java:125)
        at com.companyname.mtix.sms.services.remote.MessageServiceRemoteImpl.sendTextMessage(MessageServiceRemoteImpl.java:43)
        at sun.reflect.GeneratedMethodAccessor203.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397)
        at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186)
        at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323)
        at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:453)
        at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)
        at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at com.companyname.mtix.sms.http.filters.NoCacheFilter.doFilter(NoCacheFilter.java:63)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at com.companyname.mtix.sms.http.filters.MessageFilter.doFilter(MessageFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:61)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.ajaxanywhere.AAFilter.doFilter(AAFilter.java:46)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)
    

我们的组件是一个在Tomcat下运行的Web应用程序,它调用发送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 );

15 个答案:

答案 0 :(得分:62)

SocketException的javadoc声明它是

  

抛出以指示底层协议中存在错误,例如TCP错误

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

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

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

答案 1 :(得分:37)

此错误发生在你身边而不是另一面。如果另一方重置连接,则异常消息应该说:

java.net.SocketException reset by peer

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

答案 2 :(得分:16)

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

  1. 转到管理控制台
  2. 导航到“配置” - >“服务器配置” - >“线程池” - >“http-thread-pool”。
  3. 将“最大线程池大小”设置从5更改为
  4. 将“最小线程池大小”设置从2更改为
  5. 重启Glassfish。

答案 3 :(得分:9)

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

答案 4 :(得分:7)

就我而言,这是因为我的Tomcat设置的maxHttpHeaderSize不足以进行特别复杂的SOLR查询。

希望这有助于那里的人!

答案 5 :(得分:5)

我一直都会收到此错误,并认为这是正常的。

当一方试图在另一方已经挂断时尝试阅读时,会发生这种情况。因此取决于协议,这可能会或可能不会指出问题。 如果我的客户端代码向服务器明确指出它将挂断,则客户端和服务器可以同时挂断,并且不会发生此消息。

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

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

答案 6 :(得分:4)

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

答案 7 :(得分:3)

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

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

答案 8 :(得分:1)

我知道这个帖子有点旧,但想加我2美分。 我们有相同的"连接重置"在我们的其中一个版本之后发生错误。

根本原因是,我们的apache服务器已关闭以进行部署。我们所有的第三方流量都通过apache,因为它已关闭而导致连接重置错误。

答案 9 :(得分:1)

这是旧线程,但昨天我遇到了StringBuilder br = new StringBuilder(); for (int i = 0; i < letters.length(); i++) { if (letters.charAt(i) == 'a') br.append("s"); else br.append(letters.charAt(i)); } System.out.println(br.toString());

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

FWIW,当我意外地向期望POST请求的端点发出GET请求时,出现此错误。大概这就是特定服务器处理问题的方式。

答案 13 :(得分:-1)

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

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

希望它有所帮助...

答案 14 :(得分:-6)

我遇到了这个问题。它是由数据库中与您要通过Webservice修改的表相关的锁定会话引起的。

找到锁定的会话ID:

select * from v$lock l , all_objects a where l.TYPE ='TM' and l.id1 = a.OBJECT_ID;

这应该为您提供有关哪个表被锁定但尚未完成修改的线索。

然后在v$session

中将其删除
select * from v$session where sid = 99;

(例如 99 。)