代码之家  ›  专栏  ›  技术社区  ›  Richard Ev

是什么导致了我的java.net.socketException:connection reset?

  •  129
  • Richard Ev  · 技术社区  · 16 年前

    我们看到的是频繁但断断续续的 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应用程序,它调用一个发送短消息的第三方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 回复  |  直到 16 年前
        1
  •  61
  •   Mark    16 年前

    用于socketException的JavaDoc声明它是

    引发以指示基础协议中存在错误,如TCP错误

    在您的情况下,连接似乎已被连接的服务器端关闭。这可能是您发送的请求的问题,也可能是它们末尾的问题。

    为了帮助调试,您可以使用诸如 Wireshark 查看实际的网络数据包。还有,您可以使用Java代码替代客户端来测试Web服务吗?如果这是成功的,它可以指示Java代码中的错误。

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

        2
  •  36
  •   Nathan    7 年前

    这个错误 发生在你身边 而不是另一边。如果另一侧重置了连接,则异常消息应显示:

    java.net.SocketException reset by peer
    

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

        3
  •  16
  •   PålOliver    13 年前

    如果尝试访问部署在GlassFish3服务器上的Web服务时遇到这种情况,您可能需要调整HTTP线程池设置。当许多并发线程调用Web服务时,我们拥有的固定socketExceptions。

    1. 转到管理控制台
    2. 导航到“配置”->“服务器配置”->“线程池”->“HTTP线程池”。
    3. 将设置“最大线程池大小”从5更改为32
    4. 将设置“最小线程池大小”从2更改为16
    5. 重新启动Glassfish。
        4
  •  9
  •   Community CDub    8 年前

    我也偶然发现了这个错误。在我的案例中,问题是我使用的是JRE6,它支持 TLS1.0 . 服务器只支持TLS1.2,因此引发了此错误。

        5
  •  7
  •   inanutshellus user6579257    12 年前

    在我的例子中,这是因为我的Tomcat设置的 maxHttpHeaderSize 对于一个特别复杂的solr查询。

    希望这能帮上忙!

        6
  •  5
  •   Mark rajnik faldu    12 年前

    我总是得到这个错误并认为它是正常的。

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

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

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

        7
  •  4
  •   Paul    16 年前

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

        8
  •  3
  •   Michael Borgwardt    16 年前

    异常意味着套接字从另一侧意外关闭。因为您正在调用一个Web服务,所以不应该发生这种情况——很可能您发送的请求触发了Web服务中的错误。

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

        9
  •  1
  •   Richard Ev    8 年前

    我知道这条线有点旧,但想加我的2美分。 在我们的一个版本发布之后,就出现了同样的“连接重置”错误。

    根本原因是 apache 服务器已关闭以进行部署。我们所有的第三方流量都通过 阿帕奇 我们得到了连接重置错误,因为它正在关闭。

        10
  •  1
  •   Super Jade    6 年前

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

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

        11
  •  1
  •   Displee    6 年前

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

        12
  •  0
  •   Noumenon    7 年前

    当我试图读取的文本文件包含一个与防火墙上的防病毒签名匹配的字符串时,出现了此错误。

        13
  •  0
  •   RTF    6 年前

    fwiw,当我无意中向某个端点发出了一个get请求,而该端点正期待着一个post请求时,我得到了这个错误。大概这就是服务器处理问题的方式。

        14
  •  -1
  •   bluish dmajkic    13 年前

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

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

    希望有帮助…

        15
  •  -6
  •   Ataur Rahman Munna    8 年前

    我遇到了这个问题。这是由数据库中与要通过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;
    

    ( 九十九 比如说)