Конечно, я знаю Ajax, но проблема с Ajax заключается в том, что браузер должен часто опросить сервер, чтобы узнать, есть ли новые данные. Это увеличивает нагрузку на сервер.
Есть ли лучший способ (даже с использованием Ajax), отличный от опроса сервера?
Да, вы ищете COMET http://en.wikipedia.org/wiki/Comet_(programming). Другими хорошими условиями Google для поиска являются AJAX-push и reverse-ajax.
Да, он называется Обратный Ajax или Комета. Комета в основном является зонтичным термином для разных способов открытия долговечных HTTP-запросов, чтобы передавать данные в реальном времени в веб-браузер. Я бы рекомендовал StreamHub Push Server, у них есть классные демонстрации, и с ним гораздо легче начать работу, чем с любыми другими серверами. Ознакомиться с Начало работы с Comet и StreamHub Tutorial для быстрого ввода. Вы можете использовать Community Edition, который можно скачать бесплатно, но ограничен 20 одновременными пользователями. Коммерческая версия хорошо стоит для поддержки, плюс вы получаете клиентские адаптеры SSL и Desktop.NET и Java. Справка доступна через Google Group, там есть хорошая куча учебников в сети и там адаптер 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
};
Обработка на стороне сервера зависит от вашего десятичного стека.
Посмотрите на комету (пародия на то, что Ajax - это моющее средство, а также Comet), который в основном "обратный Ajax". Имейте в виду, что для этого требуется долговременное подключение к серверу для каждого пользователя для получения уведомлений, поэтому имейте в виду последствия для производительности при написании вашего приложения.
Комета определенно то, что вы хотите. В зависимости от ваших требований к языку/структуре существуют разные серверные библиотеки. Например, WebSync - это интегрированный комьютетный сервер IIS для разработчиков ASP.NET/C#/IIS, и есть множество других автономных серверов, таких как хорошо, если вам нужна более тесная интеграция с другими языками.
Еще одним стандартным способом является SSE (события, отправленные сервером, также известные как EventSource, после объекта JavaScript).
Интересной альтернативой кометам является использование сокетов во Flash.
Я бы настоятельно рекомендовал потратить некоторое время на комету, но я не знаю реальной реализации или библиотеки, которую вы могли бы использовать.
Для своего рода "панели управления callcenter" веб-приложения, которое включало обновление агента и статус очереди вызовов для Live Callcenter, мы разработали внутреннее решение, которое работает, но находится далеко от библиотеки, которую вы можете использовать.
Что мы сделали, так это реализовать небольшую услугу на сервере, которая разговаривает с телефонной системой, ждет новых событий и поддерживает фотографию ситуации. Эта служба предоставляет небольшой веб-сервер.
Наши веб-клиенты подключаются через HTTP к этому веб-серверу и запрашивают последнюю фотографию (закодированную в XML), отображают ее, а затем снова идут, запрашивая новую фотографию. На этом веб-сервере можно:
Таким образом, когда клиенты опроса, он получает ответ от 0 до 30 секунд макс. Если новое событие уже сгенерировано, оно получает его немедленно), в противном случае он блокируется до создания нового события.
Это в основном опрос, но это несколько умный опрос, чтобы не перегревать веб-сервер. Если комета не является вашим ответом, я уверен, что это может быть реализовано с использованием той же идеи, но с использованием более широко AJAX или кодирования в JSON для достижения лучших результатов. Это было разработано до эпохи AJAX, поэтому есть много возможностей для улучшения.
Если кто-то может обеспечить реальную облегченную реализацию этого, отлично!
Комета была придумана Алексом Расселом из Dojo Toolkit (http://www.dojotoolkit.org). Вот ссылка на дополнительную информацию http://cometdproject.dojotoolkit.org/
Возможно стоит проверить Meteor Server, который является веб-сервером, предназначенным для COMET. Nice demo, а также используется twitterfall.
Вы можете использовать приложение Flash/Flex на клиенте с BlazeDS или LiveCycle на стороне сервера. Данные могут быть переданы клиенту с использованием RTMP-соединения. Имейте в виду, что RTMP использует нестандартный порт. Но вы можете легко вернуться к опросу, если порт заблокирован.
Существуют и другие методы. Не уверен, что они "лучше" в вашей ситуации. У вас может быть Java-апплет, который подключается к серверу при загрузке страницы и ожидает отправки материала сервером. Это было бы немного медленнее при запуске, но позволило бы браузеру получать данные с сервера нечасто, без опроса.
Возможно достичь того, к чему вы стремитесь, используя постоянные http-соединения.
Просмотрите статью кометы в википедии, что хорошее место для начала.
Вы не предоставляете много информации, но если вы планируете создать какой-то сайт, управляемый событиями (a'la digg spy) или что-то в этом роде, вы, вероятно, будете искать реализацию скрытого IFRAME который соединяется с URL-адресом, где соединение никогда не закрывается, а затем вы будете нажимать script -tags с сервера на клиент для выполнения обновлений.
пожалуйста, проверьте эту библиотеку https://github.com/SignalR/SignalR, чтобы узнать, как динамически перемещать данные клиентам по мере их доступности.
Вы можете попробовать наш Кометный компонент - хотя это чрезвычайно экспериментально...!
Вы также можете посмотреть Java-кнопки, если вы используете страницы jsp.
Как только соединение открывается на сервере, его можно сохранить открытым, а сервер может нажимать контент на некоторое время назад, когда я использовал multipart/x-mixed-replace
, но это не сработало в IE.
Я думаю, что вы можете делать умные вещи с опросом, что заставляет его работать больше, чем push, не отправляя контент без изменений, но оставляя соединение открытым, но я этого никогда не делал.
Возможно, вы захотите посмотреть ReverseHTTP.