Czy istnieje sposób na PUSH dane z serwera internetowego do przeglądarki?

134

Oczywiście znam Ajax, ale problem z Ajaxem polega na tym, że przeglądarka powinna często sondować serwer, aby sprawdzić, czy są nowe dane. Zwiększa to obciążenie serwera.

Czy istnieje lepsza metoda (nawet przy użyciu Ajax) inna niż częste sondowanie serwera?

Niyaz
źródło
1
Nie jestem pewien, czy jest. Aby uczynić to koncepcyjnie prostszym dla aplikacji, myślę, że można zaimplementować warstwę transportową na szczycie żądań odpytywania, a tym samym usunąć odpowiedzialność za odpytywanie z logiki aplikacji. Może ktoś już to zaimplementował? <strong> Edycja: </strong> podobno nazywa się <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> odwrócona Ajax </a> i <a href = " en.wikipedia.org/wiki/Comet_ ( programowanie) "> Kometa </ ​​a >, ale na razie wygląda na to, że trzeba to zaimplementować samodzielnie. Czy ktoś ma do tego bibliotekę JavaScript?
Anders Sandvig
1
@Rachel - Aktualizacje na żywo, dzięki czemu możesz zobaczyć, co robią inni. Dobre dla witryn takich jak StackOverflow i aplikacji internetowych do współpracy, takich jak dokumenty Google.
Itai Bar-Haim
1
Każdy, kto robiłby tego typu rzeczy w 2016 roku, prawdopodobnie uznałby, że gniazdka internetowe byłyby lepszym wyborem dla tego rodzaju komunikacji.
Shadow,

Odpowiedzi:

37

Tak, nazywa się Reverse Ajax lub Comet . Kometa jest w zasadzie ogólnym terminem określającym różne sposoby otwierania długotrwałych żądań HTTP w celu przesyłania danych w czasie rzeczywistym do przeglądarki internetowej. Polecam StreamHub Push Server , mają kilka fajnych wersji demonstracyjnych i znacznie łatwiej jest zacząć niż z jakimkolwiek innym serwerem. Zapoznaj się z samouczkiem Pierwsze kroki z Comet i StreamHub, aby uzyskać szybkie wprowadzenie. Możesz korzystać z wersji Community Edition, która jest dostępna do pobrania za darmo, ale jest ograniczona do 20 jednoczesnych użytkowników. Wersja komercyjna jest tego warta ze względu na samą obsługę, a ponadto otrzymujesz adaptery klienckie SSL i Desktop .NET i Java. Pomoc jest dostępna za pośrednictwem Grupy dyskusyjnej Google, w sieci jest sporo samouczków, jest też adapter GWT Comet .

Nosrama
źródło
1
Zdecydowanie droga do zrobienia, kiedy już zaczniesz wdrażać to samodzielnie, zdasz sobie sprawę, ile masz do zrobienia - ponowne połączenie, długie odpytywanie, strumieniowanie ramek iframe, obsługa różnych przeglądarek, HTTPS ...
Corehpf
2
Wyjaśnienie, czym jest kometa, pomogłoby w tej odpowiedzi
Kevin Monk,
1
@Satir: dodano krótkie wyjaśnienie. Inne odpowiedzi zawierają linki do artykułu w Wikipedii.
Nosrama,
32

W dzisiejszych czasach powinieneś używać WebSockets. Jest to standard z 2011 roku, który umożliwia inicjowanie połączeń za pomocą protokołu HTTP, a następnie aktualizowanie ich do dwukierunkowej komunikacji klient-serwer opartej na wiadomościach.

Możesz łatwo zainicjować połączenie z javascript:

var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt) 
{
  var message = evt.data;
  //decode message (with JSON or something) and do the needed
};

Obsługa po stronie serwera zależy od twojego stosu tenchnology.

pafinde
źródło
2
W porównaniu ze zdarzeniami wysłanymi przez serwer: stackoverflow.com/questions/5195452/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
8
Całkowicie się zgadzam ... Używanie HTTP do komunikacji dwukierunkowej jest jak myślenie w wywołaniach REST, aby Mario wskoczył na skorupy żółwia ... to szaleństwo. NIE POTRZEBUJESZ wysyłać próśb i czekać na odpowiedzi na proste przyciski, które popychają ludzi ... Po prostu nie. HTTP to protokół dokumentów. Protokół transferu Hyper TEXT. Ajax Push to niesamowicie złożony sposób na obejście protokołu HTTP w celu wykonania tego, co WebSocket robi zgodnie z projektem. Przestań się wygłupiać i używaj odpowiedniego narzędzia do pracy.
Nick Steele,
naprawdę lubisz elipsy, a czasem nową formę czterech kropek, które będę nazywać „elipsami”!
imbatman
10

Spójrz na Comet (fałszowanie faktu, że Ajax jest środkiem czyszczącym, podobnie jak Comet), który jest w zasadzie „odwróconym Ajaxem”. Należy pamiętać, że wymaga to długotrwałego połączenia z serwerem, aby każdy użytkownik mógł otrzymywać powiadomienia, więc podczas pisania aplikacji należy mieć świadomość wpływu na wydajność.

http://en.wikipedia.org/wiki/Comet_(programming)

Dan Herbert
źródło
5

Zdecydowanie sugerowałbym zainwestowanie trochę czasu w Comet, ale nie znam rzeczywistej implementacji ani biblioteki, z której mógłbyś skorzystać.

Dla pewnego rodzaju „panelu sterowania callcenter” aplikacji internetowej, która obejmowała aktualizację statusu agenta i kolejki połączeń dla działającego Callcenter, opracowaliśmy wewnętrzne rozwiązanie, które działa, ale jest daleko od biblioteki, z której można by skorzystać.

To, co zrobiliśmy, to zaimplementowanie małej usługi na serwerze, która komunikuje się z systemem telefonicznym, czeka na nowe zdarzenia i utrzymuje zdjęcie sytuacji. Ta usługa zapewnia mały serwer WWW.

Nasi klienci sieciowi łączą się przez HTTP z tym serwerem sieciowym i proszą o ostatnie zdjęcie (zakodowane w XML), wyświetlają je, a następnie kontynuują, prosząc o nowe zdjęcie. W tym momencie serwer sieciowy może:

  • Zwróć nowe zdjęcie, jeśli istnieje
  • Zablokuj klienta na kilka sekund (30 w naszej konfiguracji), czekając na wystąpienie jakiegoś zdarzenia i zmień zdjęcie. Jeśli w tym momencie nie zostało wygenerowane żadne zdarzenie, zwraca to samo zdjęcie, tylko po to, aby połączenie pozostało żywe, a nie przekroczono limitu czasu klienta.

W ten sposób, gdy klient sonduje, otrzymuje odpowiedź w ciągu maksymalnie 30 sekund. Jeśli nowe zdarzenie zostało już wygenerowane, pobiera je natychmiast), w przeciwnym razie blokuje się do momentu wygenerowania nowego zdarzenia.

Zasadniczo jest to odpytywanie, ale dość sprytne odpytywanie, aby nie przegrzać serwera internetowego. Jeśli Comet nie jest twoją odpowiedzią, jestem pewien, że można by to zaimplementować przy użyciu tego samego pomysłu, ale w szerszym zakresie wykorzystując AJAX lub kodowanie w JSON, aby uzyskać lepsze wyniki. Zostało to zaprojektowane przed erą AJAX, więc jest wiele do zrobienia.

Jeśli ktoś może zapewnić rzeczywistą lekką implementację tego, świetnie!

Pablo Alsina
źródło
5

Ciekawą alternatywą dla Comet jest użycie gniazd we Flashu.

Gilles
źródło
2

Istnieją inne metody. Nie jestem pewien, czy są „lepsi” w Twojej sytuacji. Możesz mieć aplet Java, który łączy się z serwerem podczas ładowania strony i czeka na wysłanie danych przez serwer. Byłoby to trochę wolniejsze podczas uruchamiania, ale pozwoliłoby przeglądarce na rzadkie odbieranie danych z serwera, bez odpytywania.

Kibbee
źródło
2

Możesz użyć aplikacji Flash / Flex na kliencie z BlazeDS lub LiveCycle po stronie serwera. Dane można wypychać do klienta za pomocą połączenia RTMP. Należy pamiętać, że RTMP używa niestandardowego portu. Ale możesz łatwo wrócić do odpytywania, jeśli port jest zablokowany.

Buzzy
źródło
2

Możliwe jest osiągnięcie tego, do czego dążysz, dzięki zastosowaniu trwałych połączeń http.

Zapoznaj się z artykułem Comet na Wikipedii, to dobre miejsce na rozpoczęcie.

Nie podajesz zbyt wielu informacji, ale jeśli chcesz zbudować jakąś witrynę sterowaną wydarzeniami (a'la digg spy) lub coś w tym stylu, prawdopodobnie będziesz patrzeć na zaimplementowanie ukrytej ramki IFRAME, która łączy się z adres URL, pod którym połączenie nigdy się nie zamyka, a następnie przesyłasz tagi skryptu z serwera do klienta w celu wykonania aktualizacji.

Markus Olsson
źródło
1

Po otwarciu połączenia z serwerem może ono pozostać otwarte, a serwer może wypychać zawartość dawno temu, multipart/x-mixed-replaceale to nie działało w IE.

Myślę, że możesz robić sprytne rzeczy za pomocą odpytywania, które sprawiają, że działa bardziej jak push, nie wysyłając niezmienionych nagłówków treści, ale pozostawiając otwarte połączenie, ale nigdy tego nie robiłem.

iskry
źródło
1

sprawdź tę bibliotekę https://github.com/SignalR/SignalR, aby dowiedzieć się, jak dynamicznie przesyłać dane do klientów, gdy staną się dostępne

arun peddakotla
źródło
0

Może chciałbym również spojrzeć na ReverseHTTP .

Evan
źródło