Ява.нет.Исключения socketexception:Прерывание соединения, вызванное программным обеспечением:ошибка восстановления [дубликат]

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

  •  02-07-2019
  •  | 
  •  

Вопрос

Я не смог найти адекватный ответ на то, что именно означает следующая ошибка:

java.net.SocketException: Software caused connection abort: recv failed

Примечания:

  • Эта ошибка встречается нечасто и непредсказуема;хотя получение этой ошибки означает, что все будущие запросы к URI также завершатся неудачей.
  • Единственное решение, которое работает (к тому же, лишь изредка), - это перезагрузить Tomcat и / или сам компьютер (в данном случае Windows).
  • URI определенно доступен (что подтверждается запросом браузера выполнить выборку).

Соответствующий код:

BufferedReader reader;
try { 
 URL url = new URL(URI);
 reader = new BufferedReader(new InputStreamReader(url.openStream())));
} catch( MalformedURLException e ) { 
 throw new IOException("Expecting a well-formed URL: " + e); 
}//end try: Have a stream

String buffer;
StringBuilder result = new StringBuilder();
while( null != (buffer = reader.readLine()) ) { 
 result.append(buffer); 
}//end while: Got the contents.
reader.close();
Это было полезно?

Решение

Обычно это означает, что произошла сетевая ошибка, такая как тайм-аут TCP.Я бы начал с установки сниффера (wireshark) на соединение, чтобы посмотреть, видите ли вы какие-либо проблемы.Если произошла ошибка TCP, вы должны быть в состоянии ее увидеть.Кроме того, вы можете проверить журналы вашего маршрутизатора, если это применимо.Если где-либо задействована беспроводная связь, это еще один источник подобных ошибок.

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

Это также происходит, если ваш TLS-клиент не может пройти проверку подлинности сервером, настроенным на требование проверки подлинности клиента.

Эта ошибка возникает, когда соединение внезапно закрывается (когда TCP-соединение сбрасывается, пока в буфере отправки еще есть данные).Это условие очень похоже на гораздо более распространенное "Сброс соединения одноранговым узлом".Это может происходить нерегулярно при подключении через Интернет, но также и систематически, если выбран подходящий момент (напримерс поддерживающими подключениями на localhost).

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

Не используйте URL.open(), используйте Apache-Commons HttpClient который имеет механизм повторных попыток, пул подключений, функцию поддержания работоспособности и многие другие функции.

Пример использования:

HttpClient httpClient = HttpClients.custom()
            .setConnectionTimeToLive(20, TimeUnit.SECONDS)
            .setMaxConnTotal(400).setMaxConnPerRoute(400)
            .setDefaultRequestConfig(RequestConfig.custom()
                    .setSocketTimeout(30000).setConnectTimeout(5000).build())
            .setRetryHandler(new DefaultHttpRequestRetryHandler(5, true))
            .build();
// the httpClient should be re-used because it is pooled and thread-safe.

HttpGet request = new HttpGet(uri);
HttpResponse response = httpClient.execute(request);
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// handle response ...

Вы получаете доступ к данным http?Можете ли вы использовать библиотеку HttpClient вместо стандартной библиотеки?Библиотека имеет больше опций и будет предоставлять лучшие сообщения об ошибках.

http://hc.apache.org/httpclient-3.x/

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

Попробуйте добавить 'autoReconnect= true' в строку подключения jdbc

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

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

У меня тоже была эта проблема.Моим решением было:

sc.setSoLinger(true, 10);

КОПИРОВАТЬ С ВЕБ-САЙТА -> Используя setSoLinger() таким образом, вы можете явно установить задержку перед отправкой сброса, предоставляя больше времени для чтения или отправки данных.

Возможно, это ответ не для всех, но для некоторых людей.

Если вы используете Netbeans для управления Tomcat, попробуйте отключить HTTP monitor в Tools - Servers

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