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

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

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

18 ответов

Решение

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

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

В настоящее время вы должны использовать 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
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Может быть стоит проверить Meteor Server, который является веб-сервером, разработанным для COMET. Хорошая демонстрация, и она также используется twitterfall.

Вы можете использовать приложение Flash/Flex на клиенте с BlazeDS или LiveCycle на стороне сервера. Данные могут быть переданы клиенту с использованием соединения RTMP. Имейте в виду, что RTMP использует нестандартный порт. Но вы можете легко вернуться к опросу, если порт заблокирован.

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

Можно добиться того, к чему вы стремитесь, используя постоянные http-соединения.

Прочтите статью о комете в Википедии, это хорошее место для начала.

Вы не предоставляете много информации, но если вы смотрите на создание какого-то сайта, управляемого событиями (например, шпиона Digg) или чего-то подобного, что вы, вероятно, будете смотреть на реализацию скрытого IFRAME, который подключается к URL-адрес, по которому соединение никогда не закрывается, а затем вы отправите скрипт-теги с сервера на клиент для выполнения обновлений.

Проверьте эту библиотеку https://github.com/SignalR/SignalR чтобы узнать, как динамически передавать данные клиентам по мере их доступности.

Вы можете попробовать наш компонент Comet - хотя он очень экспериментальный...!

После того, как соединение открыто с сервером, его можно оставить открытым, и сервер может выдвигать контент давным-давно, когда я делал это с помощью multipart/x-mixed-replace но это не сработало в IE.

Я думаю, что вы можете делать умные вещи с помощью опроса, которые заставляют его работать больше как push, не отправляя содержимое неизменными заголовками, но оставляя соединение открытым, но я никогда этого не делал.

Вы также можете просмотреть Java Pushlets, если вы используете страницы JSP.

Возможно, стоит взглянуть и на ReverseHTTP.

Другие вопросы по тегам