COMET с XMLHttpRequest: непрерывные опросы

COMET с XMLHttpRequest: непрерывные опросы

Здравствуйте! В этом уроке мы рассмотрим способ организации COMET, то есть непрерывного  потока получения данных с сервера, который очень прост и используется в 95% случаях. Где можно использовать COMET? Наверное при частых опросах сервера, когда  надо отслеживать изменение данных и реагировать на эти изменения.

comet частые опросы

Частые опросы

Первое решение для непрерывного получения событий с сервера – это «частые опросы» (polling), т.е  просто периодические запросы на сервер: «эй,  изменилось ли что-нибудь?». Например, раз в 20 секунд.

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

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

Другой минус – лишний входящий трафик на сервер. При каждом запросе браузер передает множество заголовков и в ответ получает, кроме данных —  заголовки. Для некоторых приложений трафик заголовков может в 10 и более раз превосходить трафик  данных.

Недостатки
  • Задержки между событием и ответом.
  • Лишний трафик и запросы на сервер.
Достоинства
  • Довольно простая реализация.

Причём, простота реализации тут достаточно условная. Клиентская часть – довольно проста, а вот сервер получает сразу большой поток запросов.

Даже если клиент ушёл пить чай – его браузер каждые 10 секунд будет «долбить» сервер запросами. Готов ли сервер к такой нагрузке?

Длинные опросы

Длинные опросы – отличная альтернатива частым опросам. Они также удобны в реализации, и при этом сообщения будут доставляться без задержек.

Схема:

  1. Отправляется запрос на сервер.
  2. Соединение не закрывается сервером, пока не появится сообщение.
  3. Когда сообщение появилось – сервер отвечает на запрос, пересылая данные.
  4. Браузер тут же делает очередной запрос.
Читайте также  XMLHttpRequest метод POST

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

При этом если соединение разрывается само, например, из-за ошибки в сети, то браузер тут же отсылает новый запрос.

Примерный код:

function subscribe(url){
var xhr =newXMLHttpRequest(); 
xhr.onreadystatechange=function(){
if(this.readyState !=4)return;
if(this.status ==200){
onMessage(this.responseText);}
else{onError(this);}
subscribe(url);} 
xhr.open("GET", url,true); 
xhr.send();
}

Функция subscribe делает запрос, при ответе обрабатывает результат, и сразу же запускает процесс по новой.

Сервер, конечно же, должен уметь работать с большим количеством таких «ожидающих» соединений.

Область применения

Длинные опросы отлично работают в тех случаях, когда сообщения приходят очень редко.

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

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Поделиться

Об авторе

admin administrator

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: