Как узнать, КОГДА следует закрыть соединение HTTP 1.1 Keep-Alive?

StackOverflow https://stackoverflow.com/questions/140765

Вопрос

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

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


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

Это было полезно?

Решение

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

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

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

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

или

«Когда клиент или сервер хотят тайм-аут, он должен выпустить изящное закрытие транспортного соединения.Клиенты и серверы должны постоянно следить за другой стороной транспорта, и реагировать на него в зависимости от необходимости.Если клиент или сервер не обнаруживают закрытия другой стороны, это может привести к ненужному истощению ресурсов в сети ».

Другие советы

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

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

Мне нужен простой английский ответ для программиста, не использующего C :)

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top