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

134

Конечно, я знаю об 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
Любой, кто делает подобные вещи в 2016 году, вероятно, найдет веб-сокеты лучшим выбором для такого рода общения.
Тень

Ответы:

37

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

Nosrama
источник
1
Определенный путь, когда вы начнете внедрять его самостоятельно, вы поймете, сколько нужно сделать - переподключение, длинный опрос, потоковые iframes, поддержка кросс-браузерной работы, HTTPS ...
Corehpf
2
Объяснение того, что такое комета, поможет этому ответу
Кевин Монк,
1
@Satir: добавлено быстрое объяснение. Другие ответы имеют ссылки на статью в Википедии.
Носрама
32

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

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

pafinde
источник
2
Против событий, отправленных сервером: stackoverflow.com/questions/5195452/…
Сиро Сантилли ti 冠状 病 六四 事件 法轮功
8
Я полностью согласен ... Использование HTTP для двунаправленной связи - это все равно, что думать о вызовах REST, заставляя Марио прыгать на панцирях черепах ... это безумие. Вам НЕ НУЖНО делать запросы и ждать ответов, потому что простая кнопка толкает людей ... Вы просто не делаете этого. HTTP - это протокол документа. Протокол передачи гипертекста. Ajax Push - безумно сложный способ обойти HTTP, чтобы сделать то, что WebSocket делает по замыслу. Прекратите быть глупыми и используйте правильный инструмент для работы.
Ник Стил
вам действительно нравятся эллипсы, а иногда и новая форма из четырех точек, которую я назову «эллипсос»!
имбатман
10

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

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

Дэн Герберт
источник
6

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

jvenema
источник
5

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

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

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

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

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

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

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

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

Пабло Альсина
источник
5

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

жилль
источник
2

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

Kibbee
источник
2

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

Buzzy
источник
2

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

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

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

Маркус Олссон
источник
1

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

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

Sparkes
источник
1

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

Арун Педдакотла
источник
0

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

Райан Ахерн
источник