Как узнать, когда нужно закрыть соединение HTTP 1.1 Keep-Alive?
Я пишу веб-сервер на Java и хочу, чтобы он поддерживал соединения HTTP 1.1 Keep-Alive. Но как я могу сказать, когда клиент закончил отправлять запросы на данное соединение? (как двойной конец линии или что-то в этом роде).
Давайте посмотрим, как stackoverflow обрабатывает этот очень неясный вопрос - ответы на который, в Google, увязли в технических спецификациях и непонятном языке. Мне нужен простой английский ответ для программиста, не являющегося C:)
Понятно. это подтверждает мои слова. подозрение в необходимости полагаться на SocketTimeoutException. Но я не был уверен, что есть что-то, на что я мог бы положиться от клиента, что указывает, что это сделано с соединением-что позволило бы мне закрыть соединения раньше в большинстве случаев-вместо ожидания таймаута. Спасибо
4 ответа:
Если вы строите свой сервер в соответствии со стандартом, то у вас уже есть много информации, которая поможет вам здесь.
Просто говоря, он должен основываться на времени с момента использования соединения, а не столько на уровне запроса данных.
В более длинном смысле раздел практических соображений документа HTTP / 1.1 содержит некоторые рекомендации для вас:
" серверы обычно имеют некоторые значение тайм-аута, после которого они будут нет дольше поддерживать неактивное состояние соединение. Прокси-серверы могут сделать это более высокое значение, так как это вероятно что клиент будет делать больше соединения через тот же сервер. Использование постоянных соединений не устанавливает никаких требований к длине (или существование) этого тайм-аута для либо клиент, либо сервер."
Или
" когда клиент или сервер желает тайм-аут он должен выдать изящный закрыть транспортное сообщение. Клиент и серверы должны оба постоянно наблюдайте за другой стороной транспорт закрывается, и на него реагируют по мере необходимости. Если клиент или сервер не обнаруживает близость другой стороны быстро это могло вызвать ненужные утечка ресурсов в сети."
Давайте посмотрим, как stackoverflow справляется с этим очень неясным вопросом - ответы на который в Google увязли в технических спецификациях и непонятном языке.Я просто поставил Когда я должен закрыть соединение HTTP 1.1? в Google, и третий хит был HTTP сделан очень легко. В таблице содержания есть ссылка на раздел под названием постоянные соединения и заголовок "соединение: закрыть" . Этот раздел состоит из трех абзацев, использует очень простой язык, и говорит вам именно то, что вы хотите знать.
При всем уважении, программирование-это техническая работа, где детали имеют большое значение. Чтение технической документации является абсолютно необходимым навыком. Полагаясь на" простую английскую " интерпретацию спецификаций третьими сторонами, вы только сделаете плохую работу.Мне нужен простой английский ответ для программиста, не являющегося C:)
Вы можете закрыть его, когда захотите. Заголовок указывает, что клиент предпочел бы, чтобы вы оставили соединение открытым, но это не требует от сервера соблюдения. Большинство серверов оставляют его открытым примерно на 5-10 секунд, некоторые вообще не обращают на него внимания.
Вы должны прочитать RFC, касающиеся функции Keep-Alive. В противном случае вы можете получить сервер, который не работает должным образом.
Как уже указывал @[Stephen], сервер может закрыть соединение в любое время (хорошо, но не в середине пары запрос / ответ). То же самое для клиента. Любое другое решение позволило бы серверу или клиенту выполнить DoS на другой стороне.EDIT: посмотрите на заголовок соединения. Клиент и сервер) может запросить изящное закрытие соединения с помощью заголовка. Например,
Connection: close
внутри запроса-это запрос к серверу на закрытие соединения после того, как он отправит ответ.