Сервер, я здесь

Получение реакции браузера на события, происходящие на сервере, всегда представляет собой проблему. Дело в том, что сама реализация HTTP-протокола не предполагала подобного рода взаимодействия — при штатной работе данные с сервера могли быть доставлены в браузер только в ответ на очередной HTTP-запрос (предполагающий перезагрузку страницы). Между тем жизнь сразу ставила перед веб-разработчиками задачи, требующие этого, — вспомним хотя бы старые добрые html-чаты. Естественно, находились решения разной степени ужасности, эмигрирующие push-действия сервера. Например, на клиенте организовывался фрейм, перегружающийся раз в секунду и таким образом запрашивающий сервер на предмет изменения состояния.

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

С появлением в браузерах объекта XMLHTTPRequest положение немного улучшилось. Теперь появилась возможность выстраивать взаимодействие с сервером по схеме Long Polling (описанную ранее схему с опрашивающим фреймом принято называть просто Polling). Суть этого «длинного вытягивания» в следующем (рис. 84):

— клиент отправляет запрос на сервер;

— соединение не закрывается, клиент ожидает наступления события;

— событие происходит, и клиент получает ответ на свой «long»-запрос;

— клиент тут же отправляет новый запрос.

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

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *