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

我们看到频繁的java.net.SocketException: Connection reset在我们的日志中为调用发送SMS消息的第三方Web服务的组件java.net.SocketException: Connection reset错误。

我们的应用程序是用Java编写的,运行在Tomcat 5.5之上。 这是由不再和我们在一起的承包商写的。 目前的团队没有真正的Java专业知识,我们不确定Connection reset错误实际来自何处,以及如何进行调试。

这个问题似乎完全是间歇性的,与我们试图发送的消息无关。

对于这个例外的典型原因可能是什么以及我们如何继续下去的任何建议都是值得欢迎的。

整个调用堆栈包含在内,以确保完整性。

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)
    

编辑

我们的代码所在的代码行是在下面的代码片段中的最后一行。

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

SocketException的javadoc声明它是

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

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

为了帮助调试,您可以使用Wireshark等工具查看实际的网络数据包。 另外,有没有一种替代的Java代码客户端可以用来测试Web服务? 如果这是成功的,它可能表示Java代码中的错误。

在使用Commons HTTP Client时,请参阅“ 通用HTTP客户端日志记录指南” 。 这将告诉你如何在HTTP级别登录请求。

这个错误发生在你身边 ,而不是服务器端。 如果在服务器端,应该说

 java.net.SocketException reset by peer 

原因是HttpClient里面的连接被盯上了。 检查SSL的staled连接不能解决这个错误。 解决方案:转储您的客户端并重新创建。

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

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

在我的情况,这是因为我的Tomcat设置了一个特别复杂的SOLR查询不足maxHttpHeaderSize

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

我也偶然发现了这个错误。 在我的情况下,问题是我正在使用JRE6,支持TLS1.0 。 服务器只支持TLS1.2,所以这个错误被抛出。

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

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

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

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

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

我执行我的代码的方式是让客户端挂断而不说再见。 然后服务器可以捕获错误并忽略它。 在HTTP的上下文中,我认为协议的一个层次允许每个连接多一个请求,而另一个不允许。

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

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

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

希望它有帮助…

我知道这个线程是有点老,但想加我2美分。 在我们的一个版本之后,我们有相同的“连接重置”错误。

根本原因是,我们的apache服务器被放弃部署。 我们所有的第三方流量通过apache ,我们得到连接重置错误,因为它被关闭。

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

我遇到过这个问题。 这是由数据库中锁定的会话引起的,与您要通过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 )。