Podczas przeglądania Stack Exchange zauważyłem, że są dynamiczne powiadomienia, takie jak „3 nowe wiadomości, kliknij, aby pokazać”. Chcę mieć tego rodzaju dynamiczną aktualizację tego, co zamierzam wyjaśnić.
Powiedzmy, że chcę stworzyć karuzelę / pokaz slajdów z 10 ostatnich artykułów. Chcę, aby ta karuzela była aktualizowana co godzinę, w kolejce. Nowsze artykuły wypchną starsze artykuły z kolejki. Rozwiązaniem byłoby z czubka mojej głowy.
- Użytkownik loguje się do klienta.
- Klient oblicza liczbę minut do oznaczenia następnej godziny i ustawia licznik czasu do wykonania o tej godzinie.
- O godzinie godziny wyślij do serwera zapytanie o nowe artykuły, które nie były jeszcze w karuzeli.
- Obsługa odpowiedzi.
- Zresetuj timer.
Czy to możliwa do przyjęcia strategia? Czy mogę to osiągnąć bez polegania na żądaniach klientów? Innymi słowy, w jaki sposób Stack Exchange osiąga dynamiczną aktualizację?
Odpowiedzi:
Aby przekazywać dane, musisz zidentyfikować klienta, a można to zrobić, subskrybując klienta na serwerze. Gdy to zrobisz, będziesz mieć listę subskrybowanych klientów z trwałym połączeniem.
W zależności od tego, co chcesz osiągnąć, powiedziałbym, że najlepiej jest, aby klient wysyłał żądania do serwera, abyś nie musiał utrzymywać stałego połączenia i używał protokołów komunikacyjnych żądanie / odpowiedź jako HTTP.
Jednym z przykładów, który przychodzi na myśl, aby utrzymać stałe połączenie, byłby system czatu na żywo / wiadomości błyskawicznych, ponieważ komunikacja powinna odbywać się w czasie rzeczywistym.
Pamiętaj, że trwałe połączenia są zwykle wdrażane za pomocą
sockets
, co dodaje nakładkę przy wdrażaniu własnego protokołu komunikacyjnego, szyfrowania itp.źródło
Zasadniczo musisz przekazywać dane do klienta, a ponieważ komunikacja dwukierunkowa nie wchodzi w zakres protokołu HTTP, wdrożenie go we własnym zakresie nie jest łatwe.
Rozwiązaniem twojego problemu jest socket.io
Jak podaje jej strona internetowa,
„Socket.IO umożliwia dwukierunkową komunikację w czasie rzeczywistym opartą na zdarzeniach. Działa na każdej platformie, przeglądarce lub urządzeniu, jednakowo koncentrując się na niezawodności i szybkości”.
Mam nadzieję, że to rozwiąże twój problem.
źródło
Nie mogę mówić za tym, jak robi to SE, chociaż ponieważ jest to strona internetowa, istnieje kilka sposobów, które mogłyby obejmować zestaw zadań cron do uruchomienia skryptu php / asp / what-have-you na godzinę w celu przekazywania danych. Ale byłoby tak, gdybyś szukał rozwiązania opartego tylko na sieci.
Ale ponieważ wspominasz o kliencie, być może możesz utworzyć plik z datą / godziną ostatniej aktualizacji wiadomości dla tego klienta i poprosić klienta o sprawdzenie wartości zapisanej w tym pliku i porównanie go z czasem systemowym użytkownika, aby sprawdzić, czy godzina minęło od ostatniej aktualizacji. Jeśli minęła co najmniej godzina, klient żąda najnowszego strumienia wiadomości z serwera, który następnie zwraca klientowi najnowszy strumień wiadomości.
Unikałbym korzystania z timera lub przynajmniej korzystania z timera, ponieważ ta metoda działałaby tylko wtedy, gdy użytkownik utrzymuje klienta otwartego, aby utrzymać timer działający. Ale jeśli masz (również) plik, jak zasugerowałem, możesz utworzyć podprogram, aby otworzyć plik, zapisać czas w zmiennej i porównać go z czasem systemowym i wysłać żądanie, jeśli minęła co najmniej godzina. Następnie po prostu wykonujesz połączenia z subwooferem w związku z określonymi zdarzeniami. Zdecydowanie nazwałbym to przy ładowaniu formularza, ponieważ jeśli użytkownik właśnie uruchamia ponownie klienta, chciałbyś otrzymywać najnowsze wiadomości. Gdyby minęło kilka dni, odkąd byli na kliencie, to pokazałby wieści z tego starego. W najmniejszym stopniu powiązaj to sub z obciążeniem klienta i uruchom licznik zgodnie z sugestią.
Przepraszam, jeśli źle zrozumiałem, do czego zmierzasz, ponieważ nie jestem całkowicie pewien, do czego zmierzasz. Ale mam nadzieję, że tak czy inaczej, jest tu coś dla ciebie!
źródło