Есть ли какой-нибудь способ для передачи данных с веб-сервера в браузер?
Конечно, я знаю об 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". Помните, что для получения уведомлений каждому пользователю требуется долгоживущее соединение с сервером, поэтому помните о влиянии на производительность при написании приложения.
Комета, безусловно, то, что вы хотите. В зависимости от ваших требований к языку / структуре, доступны различные серверные библиотеки. Например, 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.