Gibt es eine Möglichkeit, Daten vom Webserver zum Browser zu pushen?

134

Natürlich ist mir Ajax bekannt, aber das Problem mit Ajax ist, dass der Browser den Server häufig abfragen sollte, um festzustellen, ob neue Daten vorhanden sind. Dies erhöht die Serverlast.

Gibt es eine bessere Methode (auch mit Ajax) als die häufige Abfrage des Servers?

Niyaz
quelle
1
Ich bin mir nicht sicher, ob es das gibt. Um es für die Anwendung konzeptionell einfacher zu machen, könnten Sie vermutlich zusätzlich zu den Abfrageanforderungen eine Transportschicht implementieren und so die Abrufverantwortung aus Ihrer Anwendungslogik entfernen. Vielleicht hat das sogar schon jemand umgesetzt? <strong> Bearbeiten: </ strong> Anscheinend heißt es <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> Ajax umkehren </a> und <a href = " en.wikipedia.org/wiki/Comet_ ( Programmierung) "> Komet </ a >, aber bisher sieht es so aus, als müssten Sie es selbst implementieren. Eine JavaScript-Bibliothek dafür, jemand?
Anders Sandvig
1
@Rachel - Live-Updates, damit Sie sehen können, was andere tun. Gut für Websites wie StackOverflow und für Webanwendungen für die Zusammenarbeit wie Google Docs.
Itai Bar-Haim
1
Jeder, der 2016 so etwas tut, würde wahrscheinlich feststellen, dass Websockets die bessere Wahl für diese Art der Kommunikation sind.
Schatten

Antworten:

37

Ja, es heißt Reverse Ajax oder Comet . Comet ist im Grunde ein Überbegriff für verschiedene Möglichkeiten, langlebige HTTP-Anforderungen zu öffnen, um Daten in Echtzeit an einen Webbrowser zu übertragen. Ich würde StreamHub Push Server empfehlen , sie haben einige coole Demos und es ist viel einfacher, mit ihnen zu beginnen als mit jedem anderen Server. Eine kurze Einführung finden Sie im Tutorial Erste Schritte mit Comet und StreamHub . Sie können die Community Edition verwenden, die kostenlos heruntergeladen werden kann, jedoch auf 20 gleichzeitige Benutzer beschränkt ist. Die kommerzielle Version lohnt sich allein für den Support und Sie erhalten SSL- und Desktop .NET- und Java-Clientadapter. Die Hilfe ist über die Google-Gruppe verfügbarEs gibt eine Reihe von Tutorials im Internet und einen GWT Comet-Adapter .

Nosrama
quelle
1
Auf jeden Fall der richtige Weg, sobald Sie mit der Implementierung selbst beginnen, erkennen Sie, wie viel zu tun ist - Wiederverbindung, lange Abfrage, Streaming von Iframes, Cross-Browser-Unterstützung, HTTPS ...
Corehpf
2
Eine Erklärung, was Komet ist, würde dieser Antwort helfen
Kevin Monk
1
@ Satir: fügte eine kurze Erklärung hinzu. Andere Antworten haben Links zum Wikipedia-Artikel.
Nosrama
32

Heutzutage sollten Sie WebSockets verwenden. Dies ist der Standard von 2011, der es ermöglicht, Verbindungen mit HTTP zu initiieren und diese dann auf eine auf Nachrichten basierende Kommunikation zwischen Client und Server in zwei Richtungen zu aktualisieren.

Sie können die Verbindung einfach über Javascript herstellen:

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
};

Die Sever-Side-Handhabung hängt von Ihrem Tenchnology-Stack ab.

pafinde
quelle
2
Vs Server-gesendete Ereignisse: stackoverflow.com/questions/5195452/…
Ciro Santilli 6 冠状 病 六四 事件 6
8
Ich stimme vollkommen zu ... Die Verwendung von HTTP für die bidirektionale Kommunikation ist wie das Denken in REST-Aufrufen, um Mario dazu zu bringen, auf Schildkrötenpanzer zu springen ... es ist Wahnsinn. Sie MÜSSEN keine Anfragen stellen und auf Antworten warten, wenn einfache Tasten gedrückt werden ... Sie tun es einfach nicht. HTTP ist ein Dokumentprotokoll. Hypertext Transfer Protocol. Ajax Push ist eine wahnsinnig komplexe Methode, um HTTP zu umgehen und das zu tun, was WebSocket beabsichtigt. Hören Sie auf, doof zu sein, und verwenden Sie das richtige Werkzeug für den Job.
Nick Steele
Sie mögen Ellipsen wirklich und manchmal eine neue Form von vier Punkten, die ich "Ellipsen" nennen werde!
Imbatman
10

Schauen Sie sich Comet an (eine Parodie auf die Tatsache, dass Ajax ein Reinigungsmittel ist, ebenso wie Comet), das im Grunde genommen "Reverse Ajax" ist. Beachten Sie, dass hierfür eine langlebige Serververbindung erforderlich ist, damit jeder Benutzer Benachrichtigungen erhält. Beachten Sie daher die Auswirkungen auf die Leistung beim Schreiben Ihrer App.

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

Dan Herbert
quelle
5

Ich würde dringend empfehlen, etwas Zeit in Comet zu investieren, aber ich kenne keine tatsächliche Implementierung oder Bibliothek, die Sie verwenden könnten.

Für eine Art "Callcenter-Kontrollfeld" einer Web-App, bei dem der Agent- und Anrufwarteschlangenstatus für ein Live-Callcenter aktualisiert wurde, haben wir eine interne Lösung entwickelt, die funktioniert, aber weit entfernt von einer Bibliothek ist, die Sie verwenden können.

Wir haben einen kleinen Dienst auf dem Server implementiert, der mit dem Telefonsystem kommuniziert, auf neue Ereignisse wartet und ein Foto der Situation erstellt. Dieser Service bietet einen kleinen Webserver.

Unsere Web-Clients stellen über HTTP eine Verbindung zu diesem Webserver her und fragen nach dem letzten Foto (in XML codiert), zeigen es an und fragen dann erneut nach dem neuen Foto. Der Webserver kann an dieser Stelle:

  • Geben Sie das neue Foto zurück, falls vorhanden
  • Blockieren Sie den Client für einige Sekunden (30 in unserem Setup) und warten Sie, bis ein Ereignis auftritt und das Foto geändert wird. Wenn zu diesem Zeitpunkt kein Ereignis generiert wurde, wird dasselbe Foto zurückgegeben, nur damit die Verbindung am Leben bleibt und der Client keine Zeitüberschreitung aufweist.

Auf diese Weise erhalten Clients bei Umfragen eine Antwort in maximal 0 bis 30 Sekunden. Wenn ein neues Ereignis bereits generiert wurde, wird es sofort abgerufen. Andernfalls wird es blockiert, bis ein neues Ereignis generiert wird.

Es ist im Grunde ein Polling, aber es ist ein kluges Polling, um den Webserver nicht zu überhitzen. Wenn Comet nicht Ihre Antwort ist, könnte dies sicher mit derselben Idee implementiert werden, aber mit AJAX oder Codierung in JSON, um bessere Ergebnisse zu erzielen. Dies wurde vor der AJAX-Ära entworfen, daher gibt es viel Raum für Verbesserungen.

Wenn jemand eine wirklich leichte Implementierung davon bereitstellen kann, großartig!

Pablo Alsina
quelle
5

Eine interessante Alternative zu Comet ist die Verwendung von Sockets in Flash.

Gilles
quelle
2

Es gibt andere Methoden. Ich bin mir nicht sicher, ob sie in Ihrer Situation "besser" sind. Möglicherweise verfügen Sie über ein Java-Applet, das beim Laden der Seite eine Verbindung zum Server herstellt und darauf wartet, dass vom Server Daten gesendet werden. Es wäre beim Start etwas langsamer, würde es dem Browser jedoch ermöglichen, selten Daten vom Server zu empfangen, ohne abzufragen.

Kibbee
quelle
2

Sie können eine Flash / Flex-Anwendung auf dem Client mit BlazeDS oder LiveCycle auf der Serverseite verwenden. Daten können über eine RTMP-Verbindung an den Client übertragen werden. Beachten Sie, dass RTMP einen nicht standardmäßigen Port verwendet. Sie können jedoch problemlos auf die Abfrage zurückgreifen, wenn der Port blockiert ist.

Buzzy
quelle
2

Durch die Verwendung dauerhafter http-Verbindungen können Sie erreichen, was Sie anstreben.

Schauen Sie sich den Comet-Artikel auf Wikipedia an, das ist ein guter Anfang.

Sie liefern nicht viele Informationen, aber wenn Sie eine Art ereignisgesteuerte Site (a'la digg spy) oder ähnliches erstellen möchten, werden Sie wahrscheinlich versuchen, einen versteckten IFRAME zu implementieren, mit dem eine Verbindung hergestellt wird Eine URL, bei der die Verbindung nie geschlossen wird und Sie dann Skript-Tags vom Server zum Client senden, um die Aktualisierungen durchzuführen.

Markus Olsson
quelle
1

Sobald eine Verbindung zum Server geöffnet ist, kann sie offen gehalten werden und der Server kann Inhalte pushen, die ich vor langer Zeit verwendet habe multipart/x-mixed-replace aber dies funktionierte im IE nicht.

Ich denke, Sie können mit Umfragen clevere Dinge tun, die es eher wie Push funktionieren lassen, indem Sie keine unveränderten Header für Inhalte senden, sondern die Verbindung offen lassen, aber ich habe dies nie getan.

funkelt
quelle
1

Sie können unsere Kometenkomponente ausprobieren - obwohl sie äußerst experimentell ist ...!

Thomas Hansen
quelle
1

Bitte überprüfen Sie diese Bibliothek unter https://github.com/SignalR/SignalR, um zu erfahren, wie Daten dynamisch an Clients übertragen werden, sobald sie verfügbar sind

arun peddakotla
quelle