Я заметил, просматривая Stack Exchange, что есть динамические уведомления, такие как «3 новых сообщения, нажмите, чтобы показать». Я хочу иметь такого рода динамическое обновление для того, что я собираюсь объяснить.
Допустим, я хочу создать карусель / слайд-шоу из 10 последних новостей. Я хочу, чтобы эта карусель обновлялась ежечасно, в очереди. Новые статьи будут вытеснять старые статьи из очереди. Решение от макушки моей головы будет.
- Пользователь входит в систему клиента.
- Клиент рассчитывает количество минут до отметки следующего часа и устанавливает таймер для выполнения в час.
- Через час отправьте запрос на сервер о любых новых новостных статьях, которых еще не было в карусели.
- Ручка ответа.
- Сброс таймера.
Это приемлемая стратегия? Могу ли я достичь этого, не полагаясь на запросы клиентов? Другими словами, как Stack Exchange достигает своего динамического обновления?
Ответы:
Чтобы отправить данные, вам нужно будет идентифицировать клиента, и это можно сделать, подписав клиента на сервер. Как только это будет сделано, у вас будет список подписанных клиентов с постоянным соединением.
В зависимости от того, чего вы хотите достичь, я бы сказал, что лучше всего, чтобы клиент запросил сервер, чтобы вам не приходилось поддерживать постоянное соединение и использовать протоколы обмена запросами и ответами в качестве HTTP.
Одним примером, который приходит на ум, чтобы сохранить постоянное соединение, была бы система чата в реальном времени / обмена мгновенными сообщениями, поскольку связь должна происходить в реальном времени.
Имейте в виду, что постоянное соединение обычно реализуется посредством использования
sockets
, которое добавляет наложение в реализации вашего собственного протокола связи, шифрования и т. Д.источник
По сути, вам необходимо передать данные клиенту, и поскольку двунаправленная связь не входит в сферу действия протокола HTTP, реализовать ее самостоятельно не так просто.
Решением вашей проблемы является socket.io
Как говорится на его сайте,
«Socket.IO обеспечивает двустороннюю связь на основе событий в режиме реального времени. Он работает на любой платформе, в любом браузере или устройстве, уделяя одинаковое внимание надежности и скорости».
Надеюсь, что это решит вашу проблему.
источник
Я не могу говорить о том, как SE это делает, хотя, поскольку это веб-сайт, существует несколько способов, которые могут включать задание cron для запуска сценария php / asp / what-have-you в час для отправки данных. Но это было бы, если бы вы искали решение только для веб.
Но так как вы упоминаете клиента, вы, возможно, могли бы создать файл с датой / временем последнего обновления новостей для этого клиента, и чтобы клиент проверил значение, сохраненное в указанном файле, и сравнил его с системным временем пользователя, чтобы увидеть, если час прошло с момента последнего обновления. Если прошло не менее часа, клиент запрашивает поток последних новостей с вашего сервера, который затем возвращает клиенту поток последних новостей.
Я бы избегал использования таймера или, по крайней мере, использования таймера исключительно, так как этот метод работал бы только в том случае, если пользователь оставил клиент открытым, чтобы таймер работал. Но если у вас (также) есть файл, как я и предлагал, вы можете создать подпрограмму, чтобы открыть файл, сохранить время в переменной, сравнить его с системным временем и сделать запрос, если он был не менее часа. Тогда вы просто делаете вызовы к сабвуферу в связи с определенными событиями. Я бы определенно назвал это при загрузке формы, потому что, если пользователь просто перезапускает свой клиент, вам нужны последние новости. Если бы прошло несколько дней с тех пор, как они были на клиенте, то он бы показывал старые новости. По крайней мере, привязать этот саб к клиентской загрузке и запустить таймер, как вы предложили.
Я прошу прощения, если я неправильно понял, что вы шли, потому что я не совсем уверен, что вы собираетесь. Но, надеюсь, в любом случае здесь есть что-то ценное для вас!
источник