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

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

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

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

  1. Какой код выдает это исключение? (JVM? / Tomcat? / Мой код?)
  2. Что вызывает это исключение?

Относительно № 1:

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

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

Относительно # 2

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

Вопросы:

  1. Верны ли вышеизложенные предположения (# 1 и # 2)?
  2. Можно ли это дифференцировать от ситуации: «не удалось записать клиенту из-за сетевой ошибки на стороне сервера »? или это будет отображать то же сообщение об ошибке?
  3. И самое важное: Есть ли официальный документ (например, от Sun), подтверждающий вышесказанное?

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

Ответы [ 13 ]

0 голосов
/ 01 декабря 2016

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

WireMockServer wireMockServer = null;

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

@Rule 
public WireMockRule wireMockRule = new WireMockRule(8089);
0 голосов
/ 22 сентября 2016

Эта ошибка произошла со мной во время тестирования моей службы мыла с клиентом SoapUI, в основном я пытался получить очень большое сообщение (> 500 КБ), и SoapUI закрыл соединение по таймауту.

В SoapUI перейдите по ссылке:

Файл -> Настройки - Тайм-аут сокета (мс)

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

0 голосов
/ 27 сентября 2015

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

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

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

...