Передача данных с сервера на клиент без запроса клиента?

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 в час для отправки данных. Но это было бы, если бы вы искали решение только для веб.

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

Я бы избегал использования таймера или, по крайней мере, использования таймера исключительно, так как этот метод работал бы только в том случае, если пользователь оставил клиент открытым, чтобы таймер работал. Но если у вас (также) есть файл, как я и предлагал, вы можете создать подпрограмму, чтобы открыть файл, сохранить время в переменной, сравнить его с системным временем и сделать запрос, если он был не менее часа. Тогда вы просто делаете вызовы к сабвуферу в связи с определенными событиями. Я бы определенно назвал это при загрузке формы, потому что, если пользователь просто перезапускает свой клиент, вам нужны последние новости. Если бы прошло несколько дней с тех пор, как они были на клиенте, то он бы показывал старые новости. По крайней мере, привязать этот саб к клиентской загрузке и запустить таймер, как вы предложили.

Я прошу прощения, если я неправильно понял, что вы шли, потому что я не совсем уверен, что вы собираетесь. Но, надеюсь, в любом случае здесь есть что-то ценное для вас!

WeekendRockstar
источник