Передача даних із сервера на клієнта без запиту клієнта?


11

Під час перегляду Stack Exchange я помітив, що є динамічні сповіщення типу "3 нових повідомлення, натисніть, щоб показати". Я хочу провести таке динамічне оновлення для того, що я збираюся пояснити.

Скажімо, я хочу створити карусель / слайд-шоу з 10 останніх новин. Я хочу, щоб ця карусель оновлювалася щогодини, в черзі. Новіші статті витіснять старіші статті з черги. Рішення з моєї голови було б.

  1. Користувач входить до клієнта.
  2. Клієнт обчислює # хвилини до позначки наступної години і встановлює таймер, який потрібно виконати в годину.
  3. У годину позначки надсилайте сервер запит про будь-які нові статті новин, які ще не були у каруселі.
  4. Обробляти відповідь.
  5. Скидання таймера.

Це прийнятна стратегія? Чи можу я досягти цього, не покладаючись на запити клієнтів? Іншими словами, як Stack Exchange досягає свого динамічного оновлення?


4
Погляньте на SignalR.
Роберт Харві

Рекомендую прочитати на RSS і AJAX ідеї. RSS - приклад стандартного протоколу каналів підписки, а AJAX - це концепція високого рівня щодо оновлення клієнта (браузера) без перезавантаження сторінки. Я б сказав, що саме так працює Stack Exchange.

1
@Snowman Stack Exchange використовує WebSocket. Дивіться meta.stackexchange.com/questions/10369/…
Роберт Харві

Чи клієнт - це браузер, користувацький клієнт чи щось інше?
outis

Це дещо вороже з користувачем, але ви можете оновлювати сторінку HTML кожні 15 хвилин. Більшість веб-сторінок новин роблять це.
Гілберт Ле Бланк

Відповіді:


7

Для передачі даних вам доведеться ідентифікувати Клієнта, і це буде зроблено, підписавши клієнта на сервер. Після цього у вас з’явиться список підписаних клієнтів із постійним зв’язком.

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

Одним із прикладів, який спадає на думку підтримувати постійний зв’язок, буде система прямого чату / обміну миттєвими повідомленнями, оскільки спілкування має відбуватися в режимі реального часу.

Пам’ятайте, що постійне з'єднання зазвичай реалізується за допомогою використання sockets, що додає накладення на реалізацію власного протоколу зв’язку, шифрування тощо.


2

В основному вам потрібно надіслати дані клієнту, і оскільки двонаправлена ​​комунікація не входить у сферу протоколу http, її непросто реалізувати самостійно.

Рішення вашої проблеми - socket.io

Як зазначено на веб-сайті,

"Socket.IO дозволяє в режимі реального часу двосторонній зв'язок на основі подій. Він працює на кожній платформі, браузері або пристрої, однаково орієнтуючись на надійність і швидкість."

Сподіваюся, це вирішить вашу проблему.


7
Було б корисно, якщо ви заявляєте, як і як ви пов’язані з socket.io і як це допоможе вирішити проблему запитуючих, виходячи з ваших знань / досвіду роботи з рамкою (на відміну від простої "місії" веб-сайту)
Бенні

WebSockets суворо переважніше Socket.IO тепер, коли всі основні браузери реалізують стандарт. Більшість основних мов мають реалізацію websocket, але не socket.io. Socket.io додає повідомленням додаткову структуру, тому він також не є сумісним.
Алекс Рейнкінг

1

Я не можу говорити про те, як це робить SE, хоча, оскільки це веб-сайт, існує декілька способів, які вони могли б включати в роботу задання cron, щоб запустити скрипт php / asp / what-have-you у годину для передачі даних. Але це було б, якби ви шукали лише рішення в Інтернеті.

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

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

Прошу вибачення, якщо я неправильно зрозумів, за що ви йшли, оскільки я не зовсім впевнений, для чого ви йдете. Але сподіваємось, в будь-якому випадку тут є щось цінне для вас!

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