Когда сервлеты читают или записывают фактические данные - PullRequest
0 голосов
/ 18 августа 2011

Я тестировал приложение клиент-сервер, чтобы узнать, когда сервлет фактически получает / записывает данные клиенту.

В тестовой настройке есть клиентская Java-программа, которая читает файл и отправляет файл в сервлет.

Только после того, как клиент закончит запись данных всего файла (4 МБ) в сокет, сервер начнет читать эти данные. Точно так же, когда сервлет отправляет ответ с помощью PrintWriter, ответ достигает клиента только тогда, когда возвращается метод doPost (...) в сервлете. Предполагается, что тестирование памяти Tomcat вообще не увеличилось ...

Когда устанавливается соединение / сеанс сервлета? Почему сервлет не может прочитать данные сразу, когда клиент записывает первые несколько байтов данных в сокет?

1 Ответ

2 голосов
/ 18 августа 2011

Вот как это работает. Контейнер не будет вызывать сервлет, пока весь запрос не будет получен от клиента. Выполнение этого каким-либо другим способом повлечет за собой любое количество непредвиденных последствий. Для начала вам нужно будет установить проверки завершения вручную во всех ваших сервлетах, которые просто добавят ненужный код котельной пластины.

Если вы хотите иметь возможность реагировать на HTTP-запросы с момента их получения, вам придется написать собственную программу для сокетов, связывать и прослушивать порт и обрабатывать ввод самостоятельно.

Вывод - это другое дело. Выходной поток буферизирует весь вывод сервлета, но вы можете в любой момент вызвать flushBuffer () на ServletResponse, чтобы заставить его отправлять весь текущий буферизованный контент. Предупреждение об этом, хотя, как только вы начнете отправлять данные клиенту, ответ считается «подтвержденным». Это из-за протокола HTTP, который требует, чтобы определенные части информации приходили в определенном порядке. Заголовки, например, должны отправляться первыми, это означает, что после того, как вы «зафиксировали» ответ, серверное приложение больше не сможет добавить заголовки и файлы cookie. Контейнер всегда будет вызывать flushBuffer () (или flush () для ServletOutputStream) после того, как сервлет завершит выполнение.

...