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

121

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

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

  • 1
    Я не уверен, что есть. Чтобы сделать его концептуально более простым для приложения, я полагаю, вы могли бы реализовать транспортный уровень поверх запросов на опрос, и таким образом убрать ответственность за опрос из логики вашего приложения. Может быть, кто-то даже это уже реализовал? <strong> Изменить </ strong>. По-видимому, он называется <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> обратный Ajax </a> и <a href = " en.wikipedia.org/wiki/Comet_ ( программирование) "> Comet </ a >, но пока все выглядит так, как будто вы должны реализовать это самостоятельно. Для этого есть библиотека JavaScript?
  • 1
    @Rachel - живые обновления, чтобы вы могли видеть, что делают другие. Подходит для сайтов, таких как StackOverflow, и для веб-приложений для совместной работы, таких как Google Docs.
Показать ещё 1 комментарий
Теги:
webserver
comet

18 ответов

68
Лучший ответ

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

36

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

  • 1
    Определенный путь, когда вы начнете внедрять его самостоятельно, вы поймете, сколько нужно сделать - переподключение, длительный опрос, потоковые фреймы, поддержка кросс-браузер, HTTPS ...
  • 2
    Объяснение того, что такое комета, поможет в этом ответе.
Показать ещё 2 комментария
27

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

Обработка на стороне сервера зависит от вашего десятичного стека.

  • 2
    Против событий, отправленных сервером: stackoverflow.com/questions/5195452/…
  • 8
    Я полностью согласен ... Использование HTTP для двунаправленной связи - это все равно что думать в вызовах REST, чтобы Марио прыгнул на панцири черепах ... это безумие. Вам НЕ НУЖНО делать запросы и ждать ответов, потому что простая кнопка толкает людей ... Вы просто не делаете. HTTP - это протокол документа. Протокол передачи гипертекста. Ajax Push - безумно сложный способ обойти HTTP, чтобы сделать то, что WebSocket делает по замыслу. Прекратите быть глупыми и используйте правильный инструмент для работы.
Показать ещё 1 комментарий
9

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

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

5

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

4

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

4

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

4

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

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

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

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

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

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

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

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

3

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

1

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

  • 1
    более новая версия на meteor.com, и она получает широкое распространение.
1

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

1

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

1

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

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

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

0

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

0

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

0

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

0

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

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

-1

Возможно, вы захотите посмотреть ReverseHTTP.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню