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

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

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

21.08.2008 14:04:55
Я не уверен, что есть. Чтобы сделать его концептуально более простым для приложения, я полагаю, что вы могли бы реализовать транспортный уровень поверх запросов на опрос, и таким образом убрать ответственность за опрос из логики вашего приложения. Может быть, кто-то даже это уже реализовал? <strong> Изменить </ strong>. По-видимому, он называется <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> обратный Ajax </a> и <a href = " en.wikipedia.org/wiki/Comet_ ( программирование) "> Comet </ a >, но пока все выглядит так, как будто вы должны реализовать это самостоятельно. Библиотека JavaScript для этого, кто-нибудь?
Anders Sandvig 21.08.2008 14:08:14
@Rachel - живые обновления, чтобы вы могли видеть, что делают другие. Подходит для сайтов, таких как StackOverflow, и для веб-приложений для совместной работы, таких как Google Docs.
Itai Bar-Haim 15.08.2012 12:31:37
Любой, кто делает подобные вещи в 2016 году, вероятно, найдет веб-сокеты лучшим выбором для такого рода общения.
Shadow 7.07.2016 03:25:40
18 ОТВЕТОВ
РЕШЕНИЕ

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

69
22.08.2008 06:04:17

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

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

10
22.05.2013 15:20:25

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

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

1
21.08.2008 14:09:06

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

2
21.08.2008 14:09:08

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

0
21.08.2008 14:18:00

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

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

Вы не предоставляете много информации, но если вы смотрите на создание какого-либо сайта, управляемого событиями (например, шпиона Digg) или чего-то подобного тому, что вы, вероятно, обратите внимание на реализацию скрытого IFRAME, который подключается к URL-адрес, по которому соединение никогда не закрывается, а затем вы отправите скрипт-теги с сервера на клиент для выполнения обновлений.

2
28.11.2008 09:26:47

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

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

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

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

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

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

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

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

5
21.08.2008 15:49:24

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

4
3.09.2008 03:42:40

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

5
18.09.2008 21:13:21

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

1
20.11.2008 09:28:38

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

2
20.11.2008 16:23:10

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

2
5.03.2009 18:40:20

Возможно, стоит взглянуть и на ReverseHTTP .

0
19.03.2009 08:40:53

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

36
6.08.2016 23:08:01
Определенный путь, когда вы начнете внедрять его самостоятельно, вы поймете, сколько нужно сделать - переподключение, длинный опрос, потоковые фреймы, поддержка кросс-браузерной работы, HTTPS ...
Corehpf 25.09.2009 16:31:49
Объяснение того, что такое комета, поможет этому ответу
Kevin Monk 25.09.2009 16:39:53
@Satir: добавлено быстрое объяснение. Другие ответы имеют ссылки на статью в Википедии.
Nosrama 25.09.2009 17:33:32

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

6
27.11.2009 15:59:04

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

1
24.03.2013 12:17:37

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

Работа на стороне сервера зависит от вашего стека технологий.

31
18.10.2013 20:11:53
Против событий, отправленных сервером: stackoverflow.com/questions/5195452/…
Ciro Santilli 冠状病毒审查六四事件法轮功 6.01.2016 18:21:32
Я полностью согласен ... Использование HTTP для двунаправленной связи - это все равно что думать в вызовах REST, чтобы Марио прыгнул на панцири черепах ... это безумие. Вам НЕ НУЖНО делать запросы и ждать ответов, потому что простая кнопка толкает людей ... Вы просто не делаете. HTTP - это протокол документа. Протокол передачи гипертекста. Ajax Push - безумно сложный способ обойти HTTP, чтобы сделать то, что WebSocket делает по замыслу. Прекратите быть глупыми и используйте правильный инструмент для работы.
Nick Steele 19.08.2016 16:55:42
Вы действительно любите эллипсы, а иногда и новую форму из четырех точек, которую я назову «эллипсос»!
TheyDontHaveIT 19.02.2019 14:26:18

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

5
10.03.2015 17:25:52
Последняя версия спецификации W3C w3.org/TR/2009/WD-eventsource-20091029 перенаправляет на html.spec.whatwg.org/multipage/comms.html#server-sent-events
Ciro Santilli 冠状病毒审查六四事件法轮功 6.01.2016 18:20:57