Обнаружение отключения клиента в сервлете Tomcat? - PullRequest
9 голосов
/ 03 июня 2010

Как я могу обнаружить, что клиентская сторона запроса сервлета tomcat отключена? Я прочитал, что я должен сделать response.getOutputStream (). Print (), затем response.getOutputStream (). Flush () и поймать IOException, но есть ли способ, которым я могу обнаружить это без записи каких-либо данных?

EDIT

Сервлет отправляет поток данных, который не обязательно заканчивается, но не обязательно имеет какие-либо данные, проходящие через него (это поток событий в реальном времени). Мне нужно на самом деле определить, когда клиент отключается, потому что у меня есть некоторая очистка, которую я должен сделать в этот момент (ресурсы, чтобы выпустить, и так далее). Если у меня есть доступный HttpServletRequest, попытается ли из этого чтения прочитать IOException, если клиент отключится?

Ответы [ 3 ]

8 голосов
/ 03 июня 2010

есть ли способ, которым я могу обнаружить это без записи каких-либо данных?

Нет, потому что в TCP / IP нет способа обнаружить его без записи каких-либо данных.

Не беспокойся об этом. Просто выполните запрос действий и напишите ответ. Если клиент исчез, это вызовет IOException: сброс соединения, который будет брошен в контейнер сервлета. С этим ничего не поделаешь.

5 голосов
/ 03 июня 2010

Мне нужно на самом деле определить, когда клиент отключается, потому что у меня есть некоторая очистка, которую я должен сделать в этот момент (ресурсы для освобождения, и так далее).

Там блок finally предназначен для. Это будет выполнено независимо от результата. Э.Г.

OutputStream output = null;
try {
    output = response.getOutputStream();
    // ...
    output.flush();
    // ...
} finally {
    // Do your cleanup here.
}

Если у меня есть доступный HttpServletRequest, попытается ли из этого чтения прочитать IOException, если клиент отключится?

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

2 голосов
/ 11 февраля 2012

Вы пытались очистить буфер ответа: response.flushBuffer (); Кажется, выдает IOException, когда клиент отключен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...