Комета (программирование) - Comet (programming)
Комета это веб приложение модель, в которой давно просуществовала HTTPS запрос позволяет веб сервер к толкать данные в браузер, без явного запроса браузера.[1][2] Комета является Обобщающий термин, охватывающий несколько методов для достижения этого взаимодействия. Все эти методы полагаются на функции, включенные по умолчанию в браузеры, такие как JavaScript, а не в плагинах, отличных от стандартных. Подход Comet отличается от подхода оригинальная модель сети, при котором браузер запрашивает целую веб-страницу за раз.[3]
Использование техники кометы в Веб-разработка предшествует использованию слова Комета как неологизм для коллективной техники. Комета известна под несколькими другими именами, в том числеAjax Push,[4][5]Обратный Ajax,[6] Двусторонняя паутина,[7] HTTP-поток,[7] иHTTP-сервер push[8]среди прочего.[9] Период, термин Комета не является аббревиатурой, но был придуман Алексом Расселом в его 2006 г. блог почтовый Comet: данные с низкой задержкой для браузера.[10]
В последние годы стандартизация и широкая поддержка WebSocket и Отправленные сервером события сделал модель кометы устаревшей.
История
Ранние Java-апплеты
Возможность встраивать Java-апплеты в браузеры (начиная с Netscape Navigator 2.0 в марте 1996 г.[11]) сделал возможной двустороннюю устойчивую связь, используя необработанный TCP разъем[12] для связи между браузером и сервером. Этот сокет может оставаться открытым, пока браузер находится в документе, в котором размещен апплет. Уведомления о событиях могут быть отправлены в любом формате - текстовом или двоичном - и декодированы апплетом.
Первый фреймворк для обмена данными между браузерами
Самым первым приложением, использующим связь между браузерами, было Tango Interactive,[13][неудачная проверка ] реализовано в 1996–98 гг. в Центре архитектуры «Северо-восточные параллели» (г.NPAC ) в Сиракузский университет с помощью DARPA финансирование. Архитектура TANGO была запатентована Сиракузским университетом.[14] Фреймворк TANGO широко используется в качестве инструмента дистанционного обучения.[15] Платформа была коммерциализирована CollabWorx и используется в десятке или около того приложений Command & Control и Training в Министерстве обороны США.[нужна цитата ].
Первые приложения Comet
Первый набор реализаций Comet датируется 2000 годом,[16][ненадежный источник? ] с Пушлеты, Lightstreamer, и проекты KnowNow. Пушлеты, фреймворк, созданный Юстом ван ден Броке, был одним из первых[17] реализации с открытым исходным кодом. Пушлеты были основаны на серверных сервлетах Java и клиентской библиотеке JavaScript. Bang Networks - a Силиконовая долина запуск при поддержке Netscape соучредитель Марк Андриссен - имел щедро финансируемую попытку создать стандарт push-уведомлений в реальном времени для всей сети.[18]
В апреле 2001 года Чип Морнингстар начал разработку веб-сервера на основе Java (J2SE), который использовал два HTTP-сокета, чтобы поддерживать открытыми два канала связи между пользовательским HTTP-сервером, который он разработал, и клиентом, разработанным им. Дуглас Крокфорд; действующая демонстрационная система существовала по состоянию на июнь 2001 г.[нужна цитата ] Сервер и клиент использовали формат обмена сообщениями, который основатели State Software, Inc. согласились использовать как JSON следуя предложению Крокфорда. Вся система, клиентские библиотеки, формат сообщений, известный как JSON, и сервер превратились в State Application Framework, части которого были проданы и использованы Sun Microsystems, Amazon.com, EDS и Volkswagen.[нужна цитата ]
В марте 2006 г. инженер-программист Алекс Рассел ввел термин «комета» в своем личном блоге.[19] Новый термин был игрой на Аякс (Аякс и Комета оба являются обычными бытовыми чистящими средствами в США).[20][21][22]
В 2006 году некоторые приложения представили эти методы более широкой аудитории: Meebo Многопротокольное веб-приложение чата позволило пользователям подключаться к AOL, Yahoo, и Microsoft чат-платформы через браузер; Google добавил веб-чат в Gmail; JotSpot, стартап, приобретенный Google, создал совместное редактирование документов в режиме реального времени на основе Comet.[23] Были созданы новые варианты Comet, такие как Java-based ICEfaces JSF рамки (хотя они предпочитают термин "Ajax Push"[5]). Другие, которые ранее использовали транспорты на основе Java-апплетов, вместо этого перешли на реализации на чистом JavaScript.[24]
Реализации
Приложения Comet пытаются устранить ограничения постраничная веб-модель и традиционные опрос предлагая двустороннее устойчивое взаимодействие с использованием постоянного или длительного HTTP-соединения между сервером и клиентом. Поскольку браузеры и прокси-серверы не разрабатываются с учетом событий сервера, было разработано несколько методов для достижения этой цели, каждый из которых имеет свои преимущества и недостатки. Самым большим препятствием является HTTP 1.1, в которой говорится: «Эта спецификация ... поощряет клиентов быть консервативными при открытии нескольких соединений».[25] Следовательно, сохранение одного соединения открытым для событий в реальном времени отрицательно сказывается на удобстве использования браузера: браузер может быть заблокирован от отправки нового запроса во время ожидания результатов предыдущего запроса, например, серии изображений. Это можно обойти, создав отдельный имя хоста для информации в реальном времени, которая является псевдонимом для того же физического сервера. Эта стратегия представляет собой применение сегментирования домена.
Конкретные методы реализации Comet делятся на две основные категории: потоковая передача и длинный опрос.
Потоковое
Приложение, использующее потоковую передачу Comet, открывает единственный постоянное соединение от клиентский браузер на сервер для всех Comet События. Эти события постепенно обрабатываются и интерпретируются на стороне клиента каждый раз, когда сервер отправляет новое событие, при этом ни одна из сторон не закрывает соединение.[3]
Конкретные методы для выполнения потоковой передачи Comet включают следующее:
Скрытый iframe
Основной метод динамического веб-приложения - использовать скрытый iframe HTML-элемент ( встроенный фрейм, который позволяет веб-сайту встраивать один HTML-документ в другой). Этот невидимый iframe отправляется как разбитый блок, который неявно объявляет его бесконечно длинным (иногда его называют «навсегда кадр»). По мере возникновения событий iframe постепенно заполняется сценарий
теги, содержащие JavaScript для выполнения в браузере. Поскольку браузеры отображают HTML-страницы постепенно, каждый сценарий
тег выполняется по мере его получения. Некоторым браузерам перед запуском синтаксического анализа и выполнения требуется определенный минимальный размер документа, который может быть получен путем первоначальной отправки 1-2 КБ пробелов.[26]
Одним из преимуществ метода iframes является то, что он работает во всех распространенных браузерах. Двумя недостатками этого метода являются отсутствие надежного метода обработки ошибок и невозможность отслеживания состояния процесса, вызывающего запрос.[26]
XMLHttpRequest
В XMLHttpRequest (XHR), инструмент, используемый приложениями Ajax для связи между браузером и сервером, также можно использовать для обмена сообщениями Comet между сервером и браузером путем создания пользовательского формата данных для ответа XHR и анализа каждого события с помощью JavaScript на стороне браузера. ; полагаясь только на браузер, запускающий onreadystatechange
обратный вызов каждый раз, когда он получает новые данные.
Ajax с длинным опросом
Эта статья возможно содержит оригинальные исследования.Декабрь 2017 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Ни один из вышеперечисленных потоковых транспортных средств не работает во всех современных браузерах без отрицательных побочных эффектов. Это заставляет разработчиков Comet реализовывать несколько сложных потоковых транспортов, переключаясь между ними в зависимости от браузера. Следовательно, многие приложения Comet используют длительный опрос, который легче реализовать на стороне браузера, и он работает, как минимум, в каждом браузере, поддерживающем XHR. Как следует из названия, длинный опрос требует, чтобы клиент опрашивал сервер на предмет события (или набора событий). Браузер делает запрос в стиле Ajax на сервер, который остается открытым до тех пор, пока сервер не получит новые данные для отправки в браузер, которые отправляются браузеру в виде полного ответа. Браузер инициирует новый длинный запрос на опрос, чтобы получить последующие события. IETF RFC 6202 «Известные проблемы и передовые методы использования длинного опроса и потоковой передачи в двунаправленном HTTP» сравнивает длительный опрос и потоковую передачу HTTP. Конкретные технологии для выполнения длительного опроса включают следующее:
XMLHttpRequest длинный опрос
По большей части, XMLHttpRequest длинный опрос работает как любое стандартное использование XHR. Браузер выполняет асинхронный запрос к серверу, который может дождаться доступности данных, прежде чем ответить. Ответ может содержать закодированные данные (обычно XML или же JSON ) или Javascript для выполнения клиентом. В конце обработки ответа браузер создает и отправляет еще один XHR, чтобы дождаться следующего события. Таким образом, браузер всегда сохраняет запрос к серверу, на который нужно отвечать при каждом событии.
Скрипт тега длинный опрос
В то время как любой транспорт Кометы можно заставить работать через поддомены, ни один из перечисленных выше транспортов не может использоваться в разных домены второго уровня (SLD) из-за политик безопасности браузера, предназначенных для предотвращения межсайтовый скриптинг атаки.[27] То есть, если главная веб-страница обслуживается одним SLD, а сервер Comet расположен на другом SLD (который не имеет совместное использование ресурсов из разных источников включен), события Comet нельзя использовать для изменения HTML и DOM главной страницы, используя эти транспорты. Эту проблему можно обойти, создав Прокси сервер перед одним или обоими источниками, создавая впечатление, что они происходят из одного домена. Однако это часто нежелательно по причинам сложности или производительности.
В отличие от iframe или объектов XMLHttpRequest, сценарий
теги можно указывать на любые URI, и код JavaScript в ответе будет выполнен в текущем HTML-документе. Это создает потенциальную угрозу безопасности для обоих задействованных серверов, хотя риска для поставщика данных (в нашем случае сервера Comet) можно избежать, используя JSONP.
Транспорт кометы с длинным опросом может быть создан путем динамического создания сценарий
элементов, и установив их источник в расположение сервера Comet, который затем отправляет обратно JavaScript (или JSONP) с некоторым событием в качестве полезной нагрузки. Каждый раз, когда запрос сценария завершается, браузер открывает новый, как и в случае длинного опроса XHR. Преимущество этого метода в том, что он кроссбраузерно, но при этом допускает междоменные реализации.[27]
Альтернативы
Термин Comet присущ только браузерным технологиям. Попытки улучшить HTTP-связь без опроса предпринимались с нескольких сторон:
- В HTML 5 проект спецификации, подготовленный Рабочая группа по технологиям веб-гипертекстовых приложений (WHATWG) определяет так называемые отправленные сервером события,[28] который определяет новый интерфейс JavaScript
EventSource
и новый тип MIMEтекст / поток событий
. Все основные браузеры, кроме Microsoft Internet Explorer включить эту технологию. - В HTML 5 WebSocket Рабочий проект API определяет метод создания постоянного соединения с сервером и получения сообщений через
onmessage
Перезвоните.[29] - Протокол Байе от Фонд Додзё. Он оставляет на месте специфичные для браузера транспорты и определяет протокол более высокого уровня для связи между браузером и сервером с целью обеспечения возможности повторного использования клиентский JavaScript код с несколькими серверами Comet и позволяющий одному серверу Comet взаимодействовать с несколькими реализациями JavaScript на стороне клиента. Bayeux основан на модели публикации / подписки, поэтому серверы, поддерживающие Bayeux, имеют встроенную функцию публикации / подписки.[30]
- В BOSH протокол от основы стандартов XMPP. Он имитирует двунаправленный поток между браузером и сервером с помощью двух синхронных HTTP-соединений.
- Объект JSONRequest, предложенный Дуглас Крокфорд, будет альтернативой объекту XHR.[31]
- Использование плагинов, таких как Java-апплеты или проприетарный Adobe Flash (с помощью RTMP протокол для потоковой передачи данных во Flash-приложения). У них есть то преимущество, что они работают одинаково во всех браузерах с установленным соответствующим плагином и не должны полагаться на HTTP-соединения, но имеют недостаток, заключающийся в необходимости установки плагина.
- Google объявил[32] новый Channel API для Google App Engine,[33] реализация Comet-подобного API с помощью клиентской библиотеки JavaScript в браузере. Этот API устарел. [34]
Смотрите также
Рекомендации
- ^ Криль, Пол (24 сентября 2007 г.). «Альянс AJAX признает гибридные приложения». InfoWorld. Получено 2010-10-20.
- ^ Крейн, Дэйв; Маккарти, Фил (13 октября 2008 г.). Комета и обратный Ajax: Ajax 2.0 нового поколения. Apress. ISBN 978-1-59059-998-3.
- ^ а б Гравелль, Роб. «Программирование на комете: использование Ajax для имитации проталкивания сервера». Webreference.com. Архивировано из оригинал на 2010-10-18. Получено 2010-10-20.
- ^ Эглофф, Андреас (2007-05-05). Ajax Push (a.k.a. Comet) с бизнес-интеграцией Java (JBI) (Речь). JavaOne 2007, Сан - Франциско, Калифорния: Sun Microsystems, Inc. Получено 2008-06-10.CS1 maint: location (связь)
- ^ а б "Аякс Пуш". ICEfaces.org. Получено 2014-10-23.
- ^ Крейн, Дэйв; Маккарти, Фил (июль 2008 г.). Комета и обратный Ajax: новое поколение Ajax 2.0. Апресс. ISBN 1-59059-998-5.
- ^ а б Махемофф, Майкл (июнь 2006 г.). «Веб-удаленное взаимодействие». Шаблоны проектирования Ajax. O'Reilly Media. стр.19, 85. ISBN 0-596-10180-5.
- ^ Двойник, Крис (2005-11-05). «Подробнее об Ajax и Server Push». Различные способы отправки сервера. Получено 2008-05-05.
- ^ Несбитт, Брайс (2005-11-01). "Техника медленной загрузки / обратный AJAX". Имитация Server Push в стандартном веб-браузере. Архивировано из оригинал на 2006-02-08. Получено 2008-05-06.
- ^ Рассел, Алекс (2006-03-04). "Comet: данные с низкой задержкой для браузера". Получено 2014-11-02.
- ^ "Netscape.com". Архивировано 15 ноября 1996 года.. Получено 2017-08-16.CS1 maint: BOT: статус исходного URL-адреса неизвестен (связь)
- ^ "java.net.Socket (Java 2 Platform SE v1.4.2)" В архиве 19 мая 2009 г. Wayback Machine
- ^ Бека, Лукаш (1997). «TANGO - среда для совместной работы во всемирной паутине». ПОВЕРХНОСТЬ Сиракузского университета. Центр северо-восточной параллельной архитектуры, Колледж инженерии и информатики. Получено 27 февраля 2016.
- ^ Подгорный, Марек; Бека, Лукаш; Ченг, банда; Фокс, Джеффри Ч .; Юрга, Томаш; Ольшевский, Конрад; Соколовский, Петр; Вальчак, Кшиштоф; PL (20 июня 2000 г.), Патент США: 6078948 - Независимая от платформы основа и структура совместной работы для формирования виртуальных сообществ, имеющих виртуальные комнаты с сеансами совместной работы., получено 2016-02-27
- ^ Баер, Трой (1999). «Опыт использования TANGO Interactive в распределенной мастерской» (PDF). Главный центр общих ресурсов CEWES. CEWES MSRC / PET TR / 99-21. Получено 27 февраля 2016.
- ^ "CometDaily: Comet and Push Technology". Архивировано из оригинал на 2007-11-13. Получено 2007-12-15.
- ^ Юст ван ден Броке (1 марта 2000 г.). «Пушлеты: отправка событий из сервлетов в клиентские браузеры DHTML. ». JavaWorld. Проверено 1 августа 2014.
- ^ Борланд, Джон (2001-04-01). "Станет ли кнопка" обновить "устаревшей?". Сети CNET. Получено 2008-07-22.
- ^ Алекс Рассел (3 марта 2006 г.). «Comet: данные с низкой задержкой для браузера В архиве 2008-08-12 на Wayback Machine ». Блог Алекса Рассела. Проверено 29 ноября 2007 года.
- ^ К. Тафт, Дэррил (12 мая 2006 г.). "Microsoft Scrubs Comet из набора инструментов AJAX". eWEEK.com. Получено 2008-07-21.
- ^ На орбите: создание кометы для масс: OSCON 2008 - конференции O'Reilly, 21-25 июля 2008 г., Портленд, Орегон
- ^ Живая презентация Enterprise Comet и Web 2.0 В архиве 2008-05-20 на Wayback Machine
- ^ Дион Алмаер (29 сентября 2005 г.). «Jotspot Live: живые, групповые записи »(Интервью с Абэ Феттигом). Аяксиан. Проверено 15 декабря 2007 года.
Мэтт Маршалл (15 декабря 2006 г.). «Renkoo запускает ивент-сервис - вовремя планировать праздничные коктейли ». Венчурный бит. Проверено 15 декабря 2007 года. - ^ Клинт Бултон (27 декабря 2005 г.). «Стартапы вступают в бой с AJAX ». Новости DevX. Проверено 18 февраля 2008 года.
- ^ Протокол передачи гипертекста (HTTP / 1.1): синтаксис и маршрутизация сообщений, Раздел 6.4. IETF. Дата обращения 29 июля 2014
- ^ а б Холденер III, Энтони Т. (январь 2008 г.). «Макет страницы с фреймами, которых нет». Ajax: полное руководство. O'Reilly Media. п. 320. ISBN 0-596-52838-8.
- ^ а б Фланаган, Дэвид (17 августа 2006 г.). «13.8.4 Межсайтовый скриптинг». JavaScript - полное руководство. Полное руководство. O'Reilly Media. п.994. ISBN 0-596-10199-6.
- ^ Ян Хиксон, изд. (2007-10-27). «6.2 События DOM, отправленные сервером». HTML 5 - Запрос комментариев. WHATWG. Получено 2008-10-07.
- ^ Хиксон, Ян (23 апреля 2009 г.). «API WebSocket». W3C. Получено 2009-07-21.
- ^ Алекс Рассел; и другие. (2007). "Протокол Байё - Байё 1.0draft1". Фонд Додзё. Получено 2007-12-14.
- ^ Крокфорд, Дуглас (17 апреля 2006 г.). «JSONRequest Duplex». Альтернатива XMLHttpRequest для длительной передачи данных, инициированной сервером. Получено 2008-05-05.
- ^ Приложение, The. (2010-12-02) Блог Google App Engine: с праздником от команды App Engine - выпущен пакет SDK 1.4.0. Googleappengine.blogspot.com. Проверено 12 апреля 2014.
- ^ Пол, Райан. (2010-12-06) App Engine получает Streaming API и более длинные фоновые задачи. Ars Technica. Проверено 12 апреля 2014.
- ^ "Пакет com.google.appengine.api.channel". Google. 2019-11-16. Получено 2020-04-30.
Этот API устарел.
внешняя ссылка
- Комета Дейли - сайт, посвященный статьям по технике комет
- Сравнение нескольких реализаций сервера кометы