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



учитывая этот фрагмент трассировки стека




вызвано: java. net. SocketException:
Программное обеспечение вызвало разрыв соединения :
ошибка записи сокета
at
Ява.чистая.SocketOutputStream.socketWrite0(родной
Метод)




Я попытался ответить на следующие вопросы:




  1. какой код бросает это исключение? (JVM?- Кот?-Мой код?)

  2. что вызывает это исключение бросили?


О #1:



источник Sun JVM не содержит этого точного сообщения, но я думаю, что текст программное обеспечение вызвало прерывание соединения: ошибка записи сокета из родной реализации SocketOutputStream:



private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;


о #2



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



вопросы:




  1. верны ли приведенные выше предположения (#1 и #2)?

  2. можно ли это отличить от ситуации: "не удалось написать клиенту из-за ошибки сети на сервер стороне"? или это будет отображать одно и то же сообщение об ошибке?

  3. и самое главное: есть ли официальный документ (например, от Sun), в котором говорится наверху?


мне нужно иметь доказательство того, что эта трассировка стека является "ошибкой" клиента сокета, и нет ничего, что сервер мог бы сделать, чтобы избежать этого. (за исключением перехвата исключения или использования не Sun JVM SocketOutputStream, хотя оба они на самом деле не избегают того факта, что клиент прекратил работу)

1260   12  

12 ответов:

" эта ошибка может возникать, когда локальная сетевая система прерывает соединение, например, когда WinSock закрывает установленное соединение после сбоя повторной передачи данных (приемник никогда не подтверждает данные, отправленные на сокет потока данных).". Смотрите этой статье. Смотрите также некоторые сведения о "программное обеспечение вызвало прерывание соединения".

Я видел это чаще всего, когда корпоративный брандмауэр на рабочей станции/ноутбука встает на пути, он убивает соединение.

например. У меня есть серверный процесс и клиентский процесс на одном компьютере. Сервер прослушивает все интерфейсы (0.0.0.0), и клиент пытается подключиться к общедоступному/домашнему интерфейсу (обратите внимание, что не интерфейс замыкания на себя 127.0.0.1).

Если машина имеет свою сеть отключена (например, Wi-Fi выключен), то соединение формируется. Если машина подключается к корпоративной сети (напрямую или vpn), после чего формируется соединение.

однако, если машина подключена к общественной Wi-Fi (или домашней сети), то брандмауэр пинает в убивает соединение. В этой ситуации подключение клиента к интерфейсу обратной связи работает нормально, только не к домашнему/общедоступному интерфейсу.

надеюсь, что это помогает.

чтобы доказать, какой компонент не работает, я бы контролировал связь TCP / IP с помощью wireshark и посмотрите, кто actaully закрывает порт, также тайм-ауты могут быть актуальными.

на java.net.SocketException бросается, когда есть ошибка создания или доступа сокет (например, TCP). Это обычно может быть вызвано, когда сервер прекратил соединение (без надлежащего закрытия его), поэтому перед получением полного ответа. В большинстве случаев это может быть вызвано либо проблемой таймаута (например, ответ занимает слишком много времени или сервер перегружен запросами), либо клиент отправил SYN, но он не получил ACK (подтверждение прекращения соединения). Для проблем с таймаутом можно рассмотреть возможность увеличения значения таймаута.

исключение сокета обычно поставляется с указанным подробным сообщением о проблеме.

пример подробных сообщений:

  • программное обеспечение вызвало прерывание соединения: recv не удалось.

    ошибка указывает на попытку отправить сообщение и соединение было прервано сервером. Если это произошло при подключении к базе данных, это может быть связано с использованием не совместимый разъем / J драйвер JDBC.

    возможное решение: убедитесь, что у вас есть правильные библиотеки/драйверы в вашем пути к классам.

  • программное обеспечение вызвало разрыв соединения: подключение.

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

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

  • программное обеспечение вызвало прерывание соединения: ошибка записи сокета.

    возможное решение: убедитесь, что вы записываете правильную длину байтов в поток. Так что дважды проверьте, что вы отправляете. Смотрите это thread.

  • подключение сброс одноранговым узлом: ошибка записи сокета / Соединение прервано одноранговым узлом: ошибка записи сокета

    приложение не проверило, было ли время ожидания соединения keep-alive на стороне сервера.

    возможное решение: убедитесь, что HttpClient не является нулевым перед чтением из соединения.E13222_01

  • Соединение прервано.

    подключение завершается одноранговым узлом (сервером).

  • сброс подключения.

    соединение было либо прекращено клиентом, либо закрыто серверным концом соединения из-за запроса с запросом.

    посмотреть: что вызывает мой java. net. SocketException: сброс соединения?

вы проверили исходный код Tomcat и источник JVM ? Это может дать вам больше помощи.

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

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

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

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

эта ошибка произошла со мной во время тестирования моего soap-сервиса с клиентом SoapUI, в основном я пытался получить очень большое сообщение (>500kb), и SoapUI закрыл соединение по таймауту.

на SoapUI перейти к:

File-- > Preferences--Socket Timeout (ms)

...и поставьте большое значение, например 180000 (3 минуты), это не будет идеальным решением для вашей проблемы, потому что файл на самом деле большой, но по крайней мере у вас будет ответ.

закрытое соединение в другом клиенте

в моем случае, ошибка была:

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

Он был получен в eclipse при отладке приложения java, обращающегося к базе данных H2. Источником ошибки было то, что я изначально открыл базу данных с Белкой, чтобы вручную проверить целостность. Я использовал флаг для включения нескольких подключений к одной и той же БД (т. е. AUTO_SERVER=TRUE), поэтому не было никаких проблем с подключением к БД с java.

ошибка появилась когда через некоторое время-это долгий процесс java-я решил закрыть белку для свободных ресурсов. Похоже, что SQuirreL был тем, кто "владел" экземпляром сервера БД, и что он был закрыт с помощью соединения SQuirreL.

перезапуск приложения Java не привел к повторной ошибке.

config

  • Windows 7
  • Затмение Кеплер
  • белка 3.6
  • org.h2.Водитель ver 1.4.192

мой сервер бросал это исключение в течение 2 дней, и я решил его, переместив функцию отключения с помощью:

outputStream.close();
inputStream.close();
Client.close();

до конца потока листинга. если это кому-то поможет.

в ситуации, описанной ниже, клиентская сторона выдаст такое исключение:

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

я столкнулся с той же проблемой с wireMock, издеваясь над вызовами REST API. Ранее я определял сервер следующим образом:

WireMockServer wireMockServer = null;

но он должен быть определен, как показано ниже:

@Rule 
public WireMockRule wireMockRule = new WireMockRule(8089);

Comments

    Ничего не найдено.