Что вызывает мое исключение java.net.SocketException:Сброс соединения?[дубликат]

StackOverflow https://stackoverflow.com/questions/585599

Вопрос

На этот вопрос уже есть ответ здесь:

Мы наблюдаем частые, но прерывистые 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, которое вызывает сторонний веб-сервис, который отправляет SMS-сообщения, так уж получилось.Строка нашего кода, из которой генерируется исключение, является последней строкой в приведенном ниже фрагменте кода.

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 );
Это было полезно?

Решение

В javadoc для SocketException указано, что это

Выдается, чтобы указать, что в базовом протоколе имеется ошибка, такая как ошибка TCP

В вашем случае кажется, что соединение было закрыто серверной частью соединения.Это может быть проблема с отправляемым вами запросом или проблема в конце его выполнения.

Чтобы облегчить отладку, вы могли бы рассмотреть возможность использования такого инструмента, как Проволочная Колючка чтобы просмотреть фактические сетевые пакеты.Кроме того, есть ли альтернативный клиент для вашего Java-кода, который вы могли бы использовать для тестирования веб-сервиса?Если это было успешно, это могло указывать на ошибку в коде Java.

Поскольку вы используете HTTP-клиент Commons, взгляните на Общее Руководство по ведению журнала HTTP-клиента.Это подскажет вам, как зарегистрировать запрос на уровне HTTP.

Другие советы

Эта ошибка происходит на вашей стороне и НЕ с другой стороны.Если другая сторона сбросит соединение, то в сообщении об исключении должно быть указано:

java.net.SocketException reset by peer

Причина в связи внутри HttpClient несвежий.Проверка устаревшего соединения на наличие SSL не устраняет эту ошибку.Решение:сбросьте свой клиент и создайте заново.

Если вы столкнулись с этим при попытке доступа к веб-службам, развернутым на сервере Glassfish3, возможно, вам захочется настроить параметры пула http-потоков.Это исправило исключения SocketExceptions, которые возникали у нас, когда множество параллельных потоков вызывали веб-службу.

  1. Перейдите в консоль администратора
  2. Перейдите в раздел "Конфигурации"-> "Конфигурация сервера"-> "Пулы потоков"-> "http-пул потоков".
  3. Измените параметр "Максимальный размер пула потоков" с 5 на 32
  4. Измените параметр "Минимальный размер пула потоков" с 2 на 16
  5. Перезапустите Glassfish.

Я также наткнулся на эту ошибку.В моем случае проблема заключалась в том, что я использовал JRE6 с поддержкой TLS1.0.Сервер поддерживал только TLS1.2, поэтому была выдана эта ошибка.

В моем случае это произошло потому, что мой Tomcat был установлен с недостаточным maxHttpHeaderSize для особенно сложного запроса SOLR.

Надеюсь, это кому-то там поможет!

Я постоянно получаю эту ошибку и считаю ее нормальной.

Это происходит, когда одна сторона пытается читать, когда другая сторона уже повесила трубку.Таким образом в зависимости от протокола это может указывать на проблему, а может и не указывать.Если мой клиентский код специально указывает серверу, что он собирается повесить трубку, то и клиент, и сервер могут повесить трубку одновременно, и это сообщение не произойдет.

Способ, которым я реализую свой код, заключается в том, что клиент просто вешает трубку, не попрощавшись.Затем сервер может перехватить ошибку и проигнорировать ее.В контексте HTTP я полагаю, что один уровень протокола разрешает более одного запроса на соединение, в то время как другой - нет.

Таким образом, вы можете видеть, как потенциально одна сторона может продолжать вешать трубку другой.Я сомневаюсь, что ошибка, которую вы получаете, имеет какое-либо отношение к пиратству, и вы могли бы просто перехватить ее, чтобы она не заполняла ваши файлы журналов.

Эта ошибка возникает на стороне сервера, когда клиент закрыл соединение с сокетом до того, как ответ мог быть возвращен через сокет.В сценарии веб-приложения не все из них опасны, поскольку их можно создать вручную.Например, выйдя из браузера до того, как был получен ответ.

Исключение означает, что сокет был неожиданно закрыт с другой стороны.Поскольку вы вызываете веб-службу, этого не должно произойти - скорее всего, вы отправляете запрос, который вызывает ошибку в веб-службе.

Попробуйте протоколировать весь запрос в этих случаях и посмотрите, заметили ли вы что-нибудь необычное.В противном случае свяжитесь с поставщиком веб-услуг и отправьте им свой зарегистрированный проблемный запрос.

Я знаю, что эта тема немного устарела, но хотел бы добавить свои 2 цента.У нас была такая же ошибка "сброс подключения" сразу после одного из наших релизов.

Первопричиной было то, что наш apache сервер был отключен для развертывания.Весь наш сторонний трафик проходит через apache и мы получали сообщение об ошибке сброса соединения из-за того, что оно было отключено.

Это старая тема, но я столкнулся с java.net.SocketException: Connection reset Вчера.

В серверном приложении были изменены настройки регулирования, чтобы разрешить только 1 подключение одновременно!Таким образом, иногда звонки проходили, а иногда нет.Я решил проблему, изменив настройки регулирования.

Я тоже получал именно эту ошибку: Connection reset by peer.Исключение было вызвано шаблоном Spring REST при запуске postForObject() способ.Для меня проблемой был слишком длинный HTTP-URL-запрос.Поэтому сначала проверьте, соответствует ли созданный URL-адрес тому, каким он должен быть, и, если ваш сервер действительно должен быть способен обрабатывать запросы такой длины, просто перейдите в конфигурацию сервера и увеличьте разрешенную длину URL-запросов по умолчанию.

Это решило проблему для меня, но имейте в виду:приложение может не запускаться в некоторых интернет-браузерах, особенно старых, поскольку в них зафиксирована максимальная длина запросов URL.

Надеюсь, это поможет...

Я получил эту ошибку, когда текстовый файл, который я пытался прочитать, содержал строку, соответствующую сигнатуре антивируса на нашем брандмауэре.

FWIW, я получал эту ошибку, когда случайно отправлял GET-запрос к конечной точке, которая ожидала POST-запроса.Предположительно, это был именно тот конкретный серверный способ решения проблемы.

Я получал эту ошибку, потому что порт, к которому я пытался подключиться, был закрыт.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top