2008-08-21 8 views
122

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

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

+0

@ Rachel - живые обновления, чтобы вы могли видеть, что делают другие. Хорошо подходит для таких сайтов, как StackOverflow и для веб-приложений для совместной работы, таких как документы Google. –

+0

Любой, кто занимается подобными вещами в 2016 году, вероятно, найдет веб-сайты, чтобы быть лучшим выбором для такого рода общения. – Shadow

+0

Я не уверен, что есть. Чтобы сделать его концептуально более простым для приложения, я думаю, вы могли бы реализовать транспортный уровень поверх запросов на опрос и, таким образом, удалить ответственность за опрос из своей логики приложения. Может быть, кто-то уже реализовал это? Редактировать: По-видимому, это называется reverse Ajax и Comet, но пока похоже, что вы должны его реализовать самостоятельно. Библиотека JavaScript для этого, кто-нибудь? –

ответ

9

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

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

0

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

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

1

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

-1

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

1

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

Ознакомьтесь с Comet article в Википедии, это хорошее место для начала.

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

4

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

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

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

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

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

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

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

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

4

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

0

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

1

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

1

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

+1

более новая версия на https://www.meteor.com/, и она получила широкое распространение. –

35

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

+0

Определенно, что нужно сделать, как только вы начнете реализовывать его самостоятельно, вы поймете, сколько нужно сделать - пересоединение, длительный опрос, потоковые фреймы, кросс-браузерная поддержка, HTTPS ... – Corehpf

+1

Объяснение того, что комета поможет этот ответ –

+0

@Satir: добавлено быстрое объяснение. Другие ответы содержат ссылки на статью в Википедии. – Nosrama

5

Comet определенно то, что вы хотите. В зависимости от ваших требований к языку/структуре существуют разные серверные библиотеки. Например, WebSync is an IIS-integrated comet server for ASP.NET/C#/IIS developers, а также имеется множество других автономных серверов, если вам нужна более тесная интеграция с другими языками.

0

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

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 
}; 

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

+1

Vs события, отправленные сервером: http://stackoverflow.com/questions/5195452/websockets-vs-server-sent-events-eventsource –

+7

Я полностью согласен ... Использование HTTP для двунаправленной связи - это как мышление в вызовах REST чтобы Марио прыгнул на раковины черепахи ... это безумие. Вам НЕ НУЖНО делать запросы и ждать ответов для простой кнопки, толкает людей .... Вы просто этого не делаете. HTTP - протокол документа. Протокол передачи гипертекста. Ajax Push - это безумно сложный способ обойти HTTP, чтобы сделать то, что WebSocket делает по дизайну. Остановитесь на работе и используйте подходящий инструмент для работы. –

4

Еще один, стандартный, способ SSE (Server-Sent Events, also known as EventSource, после объекта JavaScript).

+0

Последняя версия спецификации W3C http://www.w3.org/TR/2009/WD-eventsource-20091029/ перенаправляет на https://html.spec.whatwg.org/multipage/comms.html#server- посланное-событие –