Как узнать, КОГДА закрыть HTTP-соединение Keep-Alive? - PullRequest
8 голосов
/ 26 сентября 2008

Я пишу веб-сервер на Java и хочу, чтобы он поддерживал соединения HTTP 1.1 Keep-Alive. Но как я могу узнать, когда клиент завершил отправку запросов для данного соединения? (как двойной конец строки или что-то).

Давайте посмотрим, как stackoverflow обрабатывает этот очень непонятный вопрос - ответы на который, в Google, затеряны в технических спецификациях и неясном языке. Я хочу простой ответ для не программиста на C:)


Понятно. это подтверждает мое подозрение о необходимости полагаться на SocketTimeoutException. Но я не был уверен, есть ли что-то, на что я мог бы положиться от клиента, что указывает на то, что это сделано с соединением - что позволило бы мне закрыть соединения быстрее в большинстве случаев - вместо ожидания времени ожидания. Спасибо

Ответы [ 4 ]

8 голосов
/ 26 сентября 2008

Если вы строите свой сервер в соответствии со стандартом, то у вас уже есть много информации, которая поможет вам здесь.

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

В более широком смысле, раздел практических соображений документа HTTP / 1.1 содержит несколько рекомендаций для вас:

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

или

"Когда клиент или сервер желает тайм-аут ДОЛЖЕН выдать изящный закрыть на транспортное сообщение. Клиенты и серверы ДОЛЖНЫ оба постоянно следить за другой стороной транспорт закрыть, и ответить на него по мере необходимости. Если клиент или сервер не обнаруживает близость другой стороны быстро это может привести к ненужным утечка ресурсов в сети. "

4 голосов
/ 26 сентября 2008

Давайте посмотрим, как stackoverflow обрабатывает этот очень непонятный вопрос - ответы на который, в Google, погрязли в технических характеристиках и неясном языке.

Я просто положил Когда мне следует закрыть соединение HTTP 1.1? в Google, и третьим хитом стал HTTP Made Really Easy. В оглавлении есть ссылка на раздел, озаглавленный Постоянные соединения и заголовок «Соединение: закрыть» . Этот раздел состоит из трех абзацев, использует очень простой язык и говорит вам именно то, что вы хотите знать.

Я хочу простой ответ для программиста, не говорящего на C:)

При всем уважении, программирование - это техническое усилие, где детали имеют большое значение. Чтение технической документации - абсолютно необходимый навык. Если вы будете полагаться на сторонние толкования спецификаций "простым английским языком", это приведет лишь к плохой работе.

1 голос
/ 26 сентября 2008

Вы должны прочитать RFC, касающиеся функции Keep-Alive. В противном случае вы можете получить сервер, который работает не так, как ожидалось.

Как уже заметил @ [Stephen], сервер может свободно закрывать соединение в любое время, когда пожелает (хорошо, но не в середине пары запрос / ответ). То же самое для клиента. Любое другое решение позволит серверу или клиенту выполнить DoS на другой стороне.

РЕДАКТИРОВАТЬ: Посмотрите на заголовок соединения. Клиент (и сервер) может запросить постепенное закрытие соединения, используя заголовок. Например, Connection: close внутри запроса - это запрос к серверу на закрытие соединения после отправки ответа.

1 голос
/ 26 сентября 2008

Вы закрываете его, когда хотите. Заголовок указывает, что клиент предпочел бы, чтобы вы оставили соединение открытым, но это не требует от сервера соответствия. Большинство серверов оставляют его открытым примерно на 5-10 секунд, некоторые вообще не обращают на это внимания.

...