Przekazywanie danych z serwera do klienta bez żądania klienta?

11

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.

  1. Użytkownik loguje się do klienta.
  2. Klient oblicza liczbę minut do oznaczenia następnej godziny i ustawia licznik czasu do wykonania o tej godzinie.
  3. O godzinie godziny wyślij do serwera zapytanie o nowe artykuły, które nie były jeszcze w karuzeli.
  4. Obsługa odpowiedzi.
  5. 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ę?

Eric Guan
źródło
4
Spójrz na SignalR.
Robert Harvey
Polecam przeczytanie na RSS i AJAX pomysłów. RSS jest przykładem standardowego protokołu dla kanałów subskrypcji, a AJAX jest koncepcją wysokiego poziomu dotyczącą aktualizacji klienta (przeglądarki) bez ponownego ładowania strony. Założę się, że tak działa Stack Exchange.
1
@Snowman Stack Exchange korzysta z WebSocket. Zobacz meta.stackexchange.com/questions/10369/…
Robert Harvey
Czy klient jest przeglądarką, niestandardowym klientem czy czymś innym?
poza
Jest to nieco wrogie dla użytkownika, ale strona HTML może się odświeżać co około 15 minut. Większość stron z wiadomościami to robi.
Gilbert Le Blanc

Odpowiedzi:

7

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.

Christopher Francisco
źródło
2

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.

Alok Saini
źródło
7
Przydałoby się, jeśli określisz, czy i jak jesteś powiązany z socket.io oraz w jaki sposób pomoże rozwiązać problem pytających w oparciu o twoją wiedzę / doświadczenie z frameworkiem (w przeciwieństwie do zwykłego „opisu misji” na stronie)
Benni
WebSockets są zdecydowanie lepsze niż Socket.IO, ponieważ wszystkie główne przeglądarki implementują ten standard. Większość głównych języków ma implementacje websocket, ale nie implementuje socket.io. Socket.io dodaje dodatkową strukturę do wiadomości, więc też nie jest łatwo kompatybilny.
Alex Reinking,
1

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!

WeekendRockstar
źródło