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

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

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

18 ответов


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


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


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

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


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

http://en.wikipedia.org/wiki/Comet_ (Программирование)


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


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

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

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

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

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

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

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

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


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


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


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


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


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


можно достичь того, к чему вы стремитесь, с помощью постоянных http-соединений.

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

вы не предоставляете много информации, но если вы смотрите на создание какого-то управляемого событиями сайта (a'La digg spy) или что-то в этом роде, вы, вероятно, будете смотреть на реализацию скрытого IFRAME, который подключается к url-адресу, где соединение никогда не закрывается и затем вы будете нажимать теги скриптов с сервера на клиент для выполнения обновлений.


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


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

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


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


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


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


возможно, захотите взглянуть на ReverseHTTP также.