Как узнать, когда нужно закрыть соединение HTTP 1.1 Keep-Alive?


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

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


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

4 8

4 ответа:

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

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

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

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

Или

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

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

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

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

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

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

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

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

EDIT: посмотрите на заголовок соединения. Клиент и сервер) может запросить изящное закрытие соединения с помощью заголовка. Например, Connection: close внутри запроса-это запрос к серверу на закрытие соединения после того, как он отправит ответ.