Есть ли какой-нибудь способ для передачи данных с веб-сервера в браузер? - PullRequest
131 голосов
/ 21 августа 2008

Конечно, я знаю об Ajax, но проблема с Ajax заключается в том, что браузер должен часто опрашивать сервер, чтобы узнать, есть ли новые данные. Это увеличивает нагрузку на сервер.

Есть ли лучший способ (даже с использованием Ajax), кроме частого опроса сервера?

Ответы [ 18 ]

69 голосов
/ 21 августа 2008

Да, вы ищете COMET http://en.wikipedia.org/wiki/Comet_(programming). Другие полезные термины Google для поиска - AJAX-push и reverse-ajax.

36 голосов
/ 25 сентября 2009

Да, это называется Обратный Ajax или Комета . По сути, Comet - это общий термин для обозначения различных способов открытия долгоживущих HTTP-запросов для передачи данных в режиме реального времени в веб-браузер. Я бы порекомендовал StreamHub Push Server , у них есть несколько классных демонстраций, и с ним гораздо проще начать работу, чем с любым другим сервером. Ознакомьтесь с кратким руководством Начало работы с Comet и StreamHub . Вы можете использовать Community Edition, которую можно скачать бесплатно, но не более 20 одновременно работающих пользователей. Коммерческая версия того стоит, только для поддержки, а также вы получаете клиентские адаптеры SSL и Desktop .NET & Java. Справка доступна через Google Group , в сети есть много полезных руководств, а также есть GWT Comet адаптер .

29 голосов
/ 19 октября 2013

В настоящее время вы должны использовать WebSockets. Это стандарт 2011 года, который позволяет инициировать соединения с HTTP и затем обновлять их до двунаправленной связи на основе сообщений клиент-сервер.

Вы можете легко установить соединение из JavaScript:

var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt) 
{
  var message = evt.data;
  //decode message (with JSON or something) and do the needed
};

Работа на стороне сервера зависит от вашего стека теннологии.

10 голосов
/ 21 августа 2008

Посмотрите на Comet (пародия на тот факт, что Ajax является чистящим средством, как и Comet), который по сути является "обратным Ajax". Имейте в виду, что для получения уведомлений каждому пользователю требуется долгоживущее соединение с сервером, поэтому помните о влиянии на производительность при написании приложения.

http://en.wikipedia.org/wiki/Comet_(programming)

6 голосов
/ 27 ноября 2009

Комета, безусловно, то, что вы хотите. В зависимости от ваших требований к языку / структуре, доступны различные серверные библиотеки. Например, WebSync - это интегрированный IIS комет-сервер для разработчиков ASP.NET/C#/IIS , и есть множество других автономных серверов, если вам нужна более тесная интеграция с другими языками.

5 голосов
/ 21 августа 2008

Я бы настоятельно рекомендовал потратить некоторое время на Comet, но я не знаю фактической реализации или библиотеки, которую вы могли бы использовать.

Для своего рода «панели управления callcenter» веб-приложения, в которой использовался агент обновления и состояние очереди вызовов для живого Callcenter, мы разработали собственное решение, которое работает, но далеко от библиотеки, которую вы могли бы использовать.

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

Наши веб-клиенты подключаются через HTTP к этому веб-серверу и запрашивают последнюю фотографию (закодированную в формате XML), отображают ее и затем снова отправляют, запрашивая новую фотографию. Веб-сервер на данный момент может:

  • Вернуть новое фото, если оно есть
  • Заблокируйте клиента на несколько секунд (30 в нашей настройке), ожидая, когда какое-либо событие произойдет и изменит фотографию. Если в этот момент событие не было сгенерировано, оно возвращает ту же фотографию только для того, чтобы соединение оставалось в живых, а не для таймаута клиента.

Таким образом, когда клиенты опрашивают, они получают ответ в течение от 0 до 30 секунд. Если новое событие уже было сгенерировано, оно получает его немедленно), в противном случае оно блокируется, пока не будет сгенерировано новое событие.

Это в основном опрос, но это несколько умный опрос, чтобы не перегревать веб-сервер. Если Comet не ваш ответ, я уверен, что это можно реализовать с использованием той же идеи, но с использованием более широкого AJAX или кодирования в JSON для достижения лучших результатов. Это было разработано до AJAX-эры, поэтому есть много возможностей для улучшения.

Если кто-то может предоставить действительно легкую реализацию этого, отлично!

5 голосов
/ 10 марта 2015

Еще одним стандартным способом является SSE (отправленные сервером события, также известные как EventSource , после объекта JavaScript).

5 голосов
/ 19 сентября 2008

Интересной альтернативой Comet является использование сокетов во Flash.

4 голосов
/ 03 сентября 2008

Комета была фактически придумана Алексом Расселом из Dojo Toolkit (http://www.dojotoolkit.org). Вот ссылка на дополнительную информацию http://cometdproject.dojotoolkit.org/

2 голосов
/ 21 августа 2008

Есть и другие методы. Не уверен, что они "лучше" в вашей ситуации. У вас может быть Java-апплет, который подключается к серверу при загрузке страницы и ждет, когда сервер отправит материал. Это будет немного медленнее при запуске, но позволит браузеру получать данные с сервера нечасто, без опроса.

...