Чи є спосіб передати дані PUSH з веб-сервера до браузера?


134

Звичайно, я знаю про Ajax, але проблема з Ajax полягає в тому, що браузер повинен часто опитувати сервер, щоб виявити, чи є нові дані. Це збільшує навантаження сервера.

Чи є кращий метод (навіть за допомогою Ajax), окрім частого опитування сервера?


1
Я не впевнений, що існує. Щоб зробити програму концептуально простішою, я думаю, ви могли б реалізувати транспортний рівень поверх запитів опитування, і, таким чином, зняти відповідальність за опитування з логіки програми. Може, хтось навіть це вже реалізував? <strong> Редагувати: </strong> Мабуть, це називається <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> зворотний Ajax </a> та <a href = " en.wikipedia.org/wiki/Comet_ ( програмування) "> Комета </a> , але поки це виглядає так, що вам доведеться її реалізувати самостійно. Бібліотека JavaScript для цього?
Андерс Сандвіг

1
@Rachel - оновлення в реальному часі, щоб ви могли бачити, що роблять інші. Добре підходить для таких сайтів, як StackOverflow, і для веб-додатків для співпраці, таких як документи Google.
Itai Bar-Haim

1
Хто б не робив подібні речі в 2016 році, напевно, вважає, що веб-розетки будуть кращим вибором для такого типу спілкування.
Тінь

Відповіді:



37

Так, це називається Зворотний Аякс або Комета . Комета - це, в основному, парасольовий термін для різних способів відкриття довготривалих HTTP-запитів з метою передачі даних у реальному часі до веб-браузера. Я б рекомендував StreamHub Push Server , у них є цікаві демонстрації, і почати роботу набагато простіше, ніж будь-який з інших серверів. Ознайомтесь із початком роботи з кометою та підручником StreamHub для швидкого вступу. Ви можете скористатись спільнотою Edition, яка доступна для завантаження безкоштовно, але обмежена 20 одночасними користувачами. Комерційна версія заслуговує на лише підтримку, плюс ви отримуєте клієнтські адаптери SSL та Desktop .NET & Java. Довідка доступна через групу Google, у мережі є безліч навчальних посібників, а також є адаптер GWT Comet .


1
Безумовно, шлях, коли ви самі ввійдете в його реалізацію, ви зрозумієте, як багато робити - повторне підключення, тривале опитування, потокова
рамка кадрів,

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

Важка обробка залежить від вашого стенограму.



8
Я повністю згоден ... Використовувати HTTP для двостороннього спілкування - це як думати в REST-дзвінках, щоб змусити Маріо стрибати на черепашках черепах ... це божевілля. Вам НЕ ПОТРІБНО робити запити і чекати відповіді на просту кнопку, яка натискає людей .... Ви просто цього не робите. HTTP - це протокол документа. Протокол передачі гіпертекстового тексту. Ajax Push - це шалено складний спосіб обійти HTTP, щоб зробити те, що робить WebSocket задумом. Перестаньте бути гуфі і використовуйте правильний інструмент для роботи.
Нік Стіл

вам дуже подобаються еліпси, а іноді і нова форма з чотирьох крапок, яку я назву "еліпсосами"!
бойовик

10

Подивіться на Комету (підробка на той факт, що «Аякс» є миючим засобом і так само «Комета»), що в основному є «зворотним Аяксом». Пам’ятайте, що для отримання цього сповіщення потрібен тривалий зв’язок із сервером, щоб кожен користувач отримував сповіщення, тож знайте про наслідки для продуктивності при написанні програми.

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


6

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


5

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

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

Що ми зробили, це впровадити невелику послугу на сервері, яка розмовляє з телефоном-системою, чекає нових подій та підтримує фотографію ситуації. Ця послуга надає невеликий веб-сервер.

Наші веб-клієнти підключаються через HTTP до цього веб-сервера і запитують останню фотографію (закодовану в XML), виводять її на екран, а потім знову виходять із запитом про нову фотографію. На даний момент веб-сервер може:

  • Поверніть нове фото, якщо воно є
  • Блокуйте клієнта на кілька секунд (30 в нашому налаштуванні), чекаючи, коли відбудеться подія і змінить фотографію. Якщо в цей момент не було створено жодної події, вона повертає ту саму фотографію лише для того, щоб з'єднання залишилося живим і не очікувало клієнта.

Таким чином, коли опитуються клієнти, він отримує відповідь максимум від 0 до 30 секунд. Якщо нова подія вже створена, вона отримує її негайно), інакше вона блокується, поки не породжується нова подія.

Це в основному опитування, але це дещо розумне опитування, щоб не перегріти веб-сервер. Якщо Comet - це не ваша відповідь, я впевнений, що це може бути реалізовано за допомогою тієї ж ідеї, але більш широко використовуючи AJAX або кодуючи JSON для кращих результатів. Це було розроблено до епохи AJAX, тому є багато можливостей для вдосконалення.

Якщо хтось може забезпечити реальну легку реалізацію цього, чудово!


5

Цікавою альтернативою Comet є використання розетки у Flash.




2

Є й інші методи. Не впевнений, чи вони "кращі" у вашій ситуації. У вас може бути аплет Java, який підключається до сервера під час завантаження сторінки і чекає, коли сервер надішле речі. Це було б трохи повільніше при запуску, але дозволило б браузеру отримувати дані з сервера нечасто, без опитування.


2

Ви можете використовувати програму Flash / Flex на клієнті з BlazeDS або LiveCycle на стороні сервера. Дані можуть бути передані клієнту за допомогою RTMP-з'єднання. Майте на увазі, що RTMP використовує нестандартний порт. Але ви можете легко повернутися до опитування, якщо порт заблокований.


2

Можна досягти того, на що ви прагнете, використовуючи стійкі http-з'єднання.

Перегляньте статтю про комету у Вікіпедії, це хороше місце для початку.

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



1

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

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





Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.