2016-05-08 51 views
5

W moim projekcie dostępne są funkcje, takie jak czat prywatny i powiadomienia o wiadomościach. Powiadomienie o wiadomości powiadamia, jeśli są jakieś nowe nieprzeczytane wiadomości.W jaki sposób klient pobiera aktualizacje z serwera bez częstych żądań ajax?


Dla osiągnięcia tego, pomysł, który przyszedł mi do głowy jest

Jak w client - server modelu serwer powinien nasłuchiwać nowych żądań. Tak, pomyślałem, że powinien istnieć jakiś mechanizm do odsłuchiwania serwera w celu uzyskania informacji o nowych wiadomościach. Ponieważ znam ajax, użyłem żądania ajax z interwałem 2 sekund.

Żądania ajax podczas sprawdzania go w chrome będzie coś jak poniżej. Ajax requests under network section in chrome

Ale myślałem, potem, że StackOverflow powinny stosować tę samą sztuczkę, czy to był tylko pomysł, aby to zrobić, ponieważ aktualizuje informację/głosować informacji asynchronicznie.

Sprawdzając ich żądania ajax w chrome, był całkowicie pusty.

Muszę wiedzieć, jak można to osiągnąć bez częstych żądań ajaxowych (co zwiększy obciążenie serwera).
Prosty przykład z najbardziej wydajną techniką byłby bardzo przydatny do nauki.

Odpowiedz

5

ten jest znany jako Comet, i istnieje kilka sposobów, aby to osiągnąć:

  • odpytywania (co robisz - sprawdź w regularnych odstępach czasu, jeśli nie jest to wiadomość)
  • Long-odpytywanie (making wniosek, że nie otrzymasz odpowiedzi, dopóki nie jest to wiadomość)
  • żywo (otwarcie połączenia skrypt, który wysyła wykonywalne aktualizacji JavaScript przyrostowo)
  • WebSockets (najlepsza opcja, jeśli jest obsługiwany - cała reszta były hacki do tego, co Websockets były płetwy do adresowania)

Wdrażanie ich jest trudne, a tutaj jest wiele bibliotek do wyboru, które implementują je poprawnie (np. Socket.IO).

EDIT:

Prosty przykład z najbardziej efektywne techniki byłby bardzo przydatny do nauki.

Jak już powiedziałem, nie chcesz ich realizować samodzielnie, ponieważ są one trudne i pełne niebezpieczeństw; większość dobrych bibliotek Comet bierze pod uwagę funkcje przeglądarki i wybiera najlepszy protokół, dzięki czemu jest przejrzysty dla programisty, dzięki czemu bardzo łatwo się go rozwija za pomocą tego modelu. Na przykład sprawdź Socket.IO tutorials.

Należy również pamiętać, że potrzebny jest serwer obsługujący kometę: np. Socket.IO działa z Node.JS. Na przykład nie będą działać z domyślnym Apache.

+1

miałem konsoli programisty Chrome otwarte na chwilę teraz i nie widzę nic nowego w widoku sieci. Czy którakolwiek z tych opcji spowoduje coś innego, co zapobiegnie widoczności ruchu sieciowego w ten sposób? – Joel

+1

@Joel Z linku podanego w odpowiedzi _ "Comet to model aplikacji internetowej, w którym długo przechowywane żądanie HTTP pozwala serwerowi przesłać dane do przeglądarki, bez wyraźnego zażądania przez przeglądarkę." _ Ponieważ Comet jest reverse ajax. Odpowiedź jest po stronie serwera, a nie inicjowana przez przeglądarkę (klienta). Zgaduję więc, że prośby nie będą wyświetlane w internetowej konsoli programisty. – Lucky

+2

@Lucky: Nie do końca, jak to działa. Serwer nie może zainicjować żądania od klienta, bez uprzedniego kontaktu klienta z serwerem. – Amadan

3

To, o czym wspomniano, jest całkowicie w porządku, ale StackOverflow i inna strona StackExchange używają głównie WebSocket do nowoczesnych przeglądarek (obsługujących HTML5 i WebSocket).

Otwórz Developers Console w przeglądarce Chrome. Przejdź do zakładki Sieć i zastosuj filtr i odśwież stronę. widać coś jak poniżej:

enter image description here

+1

Dokładnie. Ta odpowiedź powinna zostać przyjęta. +1 –