Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как узнать, закрыл ли клиент соединение

Автор вопроса: SS3Ответов: 1

Я играл с новыми асинхронными функциями Servlet 3.0 с Tomcat 7.0.4. Я нашел это приложение для чата, которое позволяет клиентам зависать на GET запрос на получение обновлений сообщения. Это работает просто отлично, когда дело доходит до получения сообщений.

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

Это ошибка Tomcat? или я что-то пропустил здесь? Если это не ошибка, то как я должен определить, закрыл ли клиент соединение?

javaasynchronoussocketsservletstomcat

Ответы

Ответ 1 · рейтинг 1 · Adeel Ansari

Код в строке 44-47 позаботится об этом,

} catch(IOException ex) {
    System.out.println(ex);
    queue.remove(ac);
}

И здесь тоже на 75 - 83, используя таймаутную штучку,

req.addAsyncListener(new AsyncListener() {
    public void onComplete(AsyncEvent event) throws IOException {
        queue.remove(ac);
    }

    public void onTimeout(AsyncEvent event) throws IOException {
        queue.remove(ac);
    }
});

РЕДАКТИРОВАТЬ: после получения дополнительной информации.

  1. Tomcat 7.0.4 все еще находится в стадии бета-тестирования. Таким образом, вы можете ожидать такого поведения
  2. Я очень старался, но не могу найти ни метод setAsyncTimeout() в документе, ни здесь или здесь . Итак, я думаю, что они полностью удалили его в окончательной версии по какой-то неизвестной уважительной причине.
  3. В примере говорится: "почему я должен использовать инфраструктуру вместо ожидания Servlet 3.0 Async API". Из чего следует, что это написано до последней штуки

Итак, что я могу сказать, объединив все эти факты, что вы пытаетесь работать с тем, что в каком-то смысле сломано. Это также, возможно, причина различных и странных результатов.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы