Здесь мы подведём итог раздела, сравним транспорты и их возможности.
Способы опроса сервера
Основные способы опроса сервера:
-
Частые опросы – регулярно к серверу отправляется запрос за данными. Сервер тут же отвечает на него, возвращая данные, если они есть. Если нет – получается, что запрос был зря.
Этот способ очень лёгок в реализации, но приводит к большому количеству лишних запросов, поэтому мы его далее не рассматриваем.
-
Длинные опросы – к серверу отправляется запрос за данными. Сервер не отвечает на него, пока данные не появятся. Когда данные появились – ответ с ними отправляется в браузер, и тот тут же делает новый запрос.
Способ хорош, пока сообщений не слишком много. В идеальном случае соединение почти всё время висит открытым, лишь иногда сервер отвечает на него, доставляя данные в браузер.
Также удобен в реализации, но даёт большое количество висящих соединений на сервере. Не все сервера хорошо поддерживают это. Например,
Apache
будет есть очень много памяти. -
Потоковое соединение – открыто соединение к серверу, и через него непрерывно поступают данные.
Таблица транспортов
Основные характеристики всех транспортов, которые мы обсуждали в деталях, собраны в этой таблице.
Они были детально рассмотрены в предыдущих главах раздела.
XMLHttpRequest |
IFRAME |
SCRIPT |
EventSource |
WebSocket |
|
---|---|---|---|---|---|
Кросс-доменность | да, кроме IE9-x1 | даi1 | да | да | да |
Методы | Любые | GET / POST | GET | GET | Свой протокол |
COMET | Длинные опросыx2 | Непрерывное соединение | Длинные опросы | Непрерывное соединение | Непрерывное соединение в обе стороны |
Поддержка | Все браузеры, ограничения в IE9-x3 | Все браузеры | Все браузеры | Кроме IE | IE 10, FF11, Chrome 16, Safari 6, Opera 12.5w1 |
Пояснения:
XMLHttpRequest
- В IE8-9 поддерживаются кросс-доменные GET/POST запросы с ограничениями через
XDomainRequest
. - Можно говорить об ограниченной поддержке непрерывного соединения через
onprogress
, но это событие вызывается не чаще чем в 50ms и не гарантирует получение полного пакета данных. Например, сервер может записать "Привет!", а событие вызовется один раз, когда браузер получил "При". Поэтому наладить обмен пакетами сообщений с его помощью затруднительно. - Многие возможности современного стандарта включены в IE лишь с версии 10.
IFRAME
- Во всех современных браузерах и IE8 кросс-доменность обеспечивает
postMessage
. В более старых браузерах возможны решения черезwindow.name
и хэш.
WebSocket
- Имеется в виду поддержка окончательной редакции протокола RFC 6455. Более старые браузеры могут поддерживать черновики протокола. IE9- не поддерживает
WebSocket
.
Существует также нестандартный транспорт, не рассмотренный здесь:
-
XMLHttpRequest с флагом
multipart
, только для Firefox.При указании свойства
xhr.multipart = true
и специального multipart-формата ответа сервера, Firefox инициируетonload
при получении очередной части ответа. Ответ может состоять из любого количества частей, досылаемых по инициативе сервера. Мы не рассматривали его, так как Firefox поддерживает другие, более кросс-браузерные и стандартные транспорты.
В современных браузерах поддерживается новый метод fetch, в качестве замены XMLHttpRequest (полифил).