Java.net. SocketException: программное обеспечение вызвало прерывание соединения: recv failed [дубликат]


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

  • Официальные причины " программное обеспечение вызвало прерывание соединения: ошибка записи сокета" 12 ответов

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

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();
10 69

10 ответов:

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

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

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

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

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

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

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-порту. Это случилось со мной, когда я попытался использовать порт и был сделан другой программой.

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

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

sc.setSoLinger(true, 10);

копировать с веб-сайта -->с помощью setSoLinger() метод, вы можете явно установить задержку перед отправкой сброса, давая больше времени для чтения или отправки данных.

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