что происходит на сервере приложений (tomcat и т. д.), когда клиентский запрос отменен и сервер все еще работает?(пишет на своем выходе) - PullRequest
2 голосов
/ 01 марта 2012

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

java.net.SocketException: Connection reset by peer: socket write error

Но что именно происходит?

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

Операция останавливается, потому что сокет выдает эту ошибку при закрытии соединения? Если он не остановлен, что происходит с данными, сброшенными в выходном потоке после этого?

Спасибо

1 Ответ

1 голос
/ 18 мая 2012

Я не могу сказать, что делает Tomcat, но вот что происходит:

  1. клиент изящно закрыл сокет (затем сервер получает уведомление о закрытии и закрывает свою сторону соединения, в этом случае все буферизованные данные, готовые к отправке, теряются);

  2. клиент жестоко обрезал сокет (тогда сервер НЕ уведомляется и он обнаружит потерю соединения после тайм-аута или при первой попытке отправить данные - это не удастся).

Таким образом, если ваш поток «постоянный», сервер всегда будет «защищен» от необнаруженных потерянных соединений (первая попытка отправки очистит область).

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

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

...