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

我们在日志中看到频繁但间歇性的 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 );
1030195 次浏览

Exception 意味着套接字从另一端意外关闭。因为您正在调用 Web 服务,所以这种情况不应该发生——最有可能的情况是,您发送的请求会触发 Web 服务中的 bug。

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

SocketException 的 javadoc 声明它是

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

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

为了帮助调试,您可以考虑使用诸如 金线鲨之类的工具来查看实际的网络数据包。另外,有没有可以替代 Java 代码的客户机来测试 Web 服务?如果成功,它可能表明 Java 代码中存在 bug。

当您使用 Commons HTTP Client 时,请看一下 公共 HTTP 客户端日志记录指南。这将告诉您如何在 HTTP 级别记录请求。

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

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

java.net.SocketException reset by peer

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

我经常遇到这样的错误,我认为这是正常的。

当一方试图阅读时,另一方已经挂断了,这种情况就会发生。 如果我的客户端代码明确指示服务器要挂机,那么客户端和服务器可以同时挂机,这条消息就不会发生。

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

因此,你可以看到如何潜在的一方可以继续挂在另一方。我怀疑您收到的错误是任何盗版的关注,您可以简单地赶上它,以防止填写您的日志文件。

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

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

希望能帮上忙。

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

  1. 转到管理控制台
  2. 导航到“ Configurations”-> “ Server config”-> “ Thread pool”-> “ http-Thread-pool”。
  3. 将“最大线程池大小”设置从5更改为32
  4. 将“最小线程池大小”设置从2更改为16
  5. 重启玻璃鱼。

在我的例子中,这是因为我的 Tomcat 设置的 maxHttpHeaderSize不足以用于特别复杂的 SOLR 查询。

希望这能帮到别人!

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

我知道这个帖子有点旧,但是我想加上我的2分钱。 在其中一个版本发布后,我们出现了相同的“连接重置”错误。

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

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

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

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

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

我得到这个错误是因为我尝试连接的端口关闭了。