Gibt es eine Möglichkeit, Daten per PUSH vom Webserver zum Browser zu übertragen?

StackOverflow https://stackoverflow.com/questions/19995

  •  09-06-2019
  •  | 
  •  

Frage

Natürlich kenne ich Ajax, aber das Problem bei Ajax ist, dass der Browser den Server regelmäßig abfragen sollte, um herauszufinden, ob neue Daten vorhanden sind.Dadurch erhöht sich die Serverlast.

Gibt es eine bessere Methode (auch mit Ajax), als den Server regelmäßig abzufragen?

War es hilfreich?

Lösung

Ja, was Sie suchen, ist COMET http://en.wikipedia.org/wiki/Comet_(Programmierung).Andere gute Google-Begriffe für die Suche sind AJAX-Push und Reverse-Ajax.

Andere Tipps

Ja, es heißt Umgekehrter Ajax oder Komet.Comet ist im Grunde ein Überbegriff für verschiedene Möglichkeiten, langlebige HTTP-Anfragen zu öffnen, um Daten in Echtzeit an einen Webbrowser zu übertragen.Ich würde es empfehlen StreamHub-Push-Server, sie haben einige coole Demos und der Einstieg ist viel einfacher als bei allen anderen Servern.Besuche die Erste Schritte mit Comet und StreamHub-Tutorial für eine kurze Einführung.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 schon wegen des Supports, außerdem erhalten Sie SSL- und Desktop-.NET- und Java-Client-Adapter.Hilfe erhalten Sie über die Google-Gruppe, es gibt eine Menge Tutorials im Internet und es gibt eine GWT Comet-Adapter zu.

Heutzutage sollten Sie WebSockets verwenden.Hierbei handelt es sich um einen Standard aus dem Jahr 2011, der es ermöglicht, Verbindungen mit HTTP zu initiieren und diese dann auf eine bidirektionale nachrichtenbasierte Client-Server-Kommunikation zu aktualisieren.

Sie können die Verbindung ganz einfach über Javascript initiieren:

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 serverseitige Handhabung hängt von Ihrem Technologie-Stack ab.

Schauen Sie sich den Kometen an (eine Parodie darüber, dass Ajax ein Reinigungsmittel ist, ebenso wie Comet), das im Grunde genommen "reverse ajax" ist. Beachten Sie, dass dies eine langlebige Serververbindung für jeden Benutzer erfordert, um Benachrichtigungen zu erhalten. Beachten Sie daher die Auswirkungen auf die Leistung beim Schreiben Ihrer App.

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

Comet ist definitiv das, was Sie wollen.Abhängig von Ihren Sprach-/Framework-Anforderungen stehen verschiedene Serverbibliotheken zur Verfügung.Zum Beispiel, WebSync ist ein IIS-integrierter Comet-Server für ASP.NET/C#/IIS-Entwickler, und es gibt auch eine Reihe anderer eigenständiger Server, wenn Sie eine engere Integration mit anderen Sprachen benötigen.

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, das die Aktualisierung des Agenten- und Anrufwarteschlangenstatus für ein Live-Callcenter umfasst, haben wir eine interne Lösung entwickelt, die funktioniert, aber weit von einer Bibliothek entfernt ist, die Sie verwenden könnten.

Wir haben auf dem Server einen kleinen Dienst implementiert, der mit dem Telefonsystem kommuniziert, auf neue Ereignisse wartet und ein Foto der Situation speichert.Dieser Dienst stellt einen kleinen Webserver zur Verfügung.

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 zu diesem Zeitpunkt:

  • Geben Sie das neue Foto zurück, falls vorhanden
  • Blockieren Sie den Client für einige Sekunden (30 in unserem Setup), warten Sie auf das Eintreten eines Ereignisses und ändern Sie das Foto.Wenn zu diesem Zeitpunkt kein Ereignis generiert wurde, wird dasselbe Foto zurückgegeben, nur um sicherzustellen, dass die Verbindung aktiv bleibt und der Client keine Zeitüberschreitung erfährt.

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

Es handelt sich im Grunde genommen um eine Abfrage, aber die Abfrage ist einigermaßen intelligent, um den Webserver nicht zu überhitzen.Wenn Comet nicht Ihre Antwort ist, könnte dies sicher mit der gleichen Idee implementiert werden, aber mit umfangreicherem AJAX oder Codierung in JSON, um bessere Ergebnisse zu erzielen.Dies wurde vor der AJAX-Ära entwickelt, daher gibt es viel Raum für Verbesserungen.

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

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

Noch ein anderer, standardmäßiger Weg ist SSE (Server-Sent Events, auch bekannt als EventSource, nach dem JavaScript-Objekt).

Comet wurde tatsächlich von Alex Russell vom Dojo Toolkit geprägt ( http://www.dojotoolkit.org ).Hier ist ein Link zu weiteren Informationen http://cometdproject.dojotoolkit.org/

Es gibt andere Methoden.Ich bin mir nicht sicher, ob sie in Ihrer Situation „besser“ sind.Sie könnten ein Java-Applet haben, das beim Laden der Seite eine Verbindung zum Server herstellt und darauf wartet, dass Daten vom Server gesendet werden.Es wäre beim Start etwas langsamer, würde es dem Browser aber ermöglichen, in unregelmäßigen Abständen Daten vom Server zu empfangen, ohne dass eine Abfrage erforderlich wäre.

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.

Durch die Verwendung dauerhafter http-Verbindungen können Sie Ihr Ziel erreichen.

Besuche die Komet-Artikel drüben bei Wikipedia, das ist ein guter Anfang.

Sie stellen nicht viele Informationen bereit, aber wenn Sie eine ereignisgesteuerte Website (à la Digg Spy) oder etwas in der Art erstellen möchten, werden Sie wahrscheinlich einen versteckten IFRAME implementieren, der eine Verbindung herstellt eine URL, bei der die Verbindung niemals geschlossen wird, und dann übertragen Sie Skript-Tags vom Server an den Client, um die Aktualisierungen durchzuführen.

Könnte einen Blick wert sein Meteor-Server Dabei handelt es sich um einen für COMET entwickelten Webserver.Hübsch Demo und es wird auch von verwendet Twitterfall.

Sobald eine Verbindung zum Server geöffnet ist, kann sie offen gehalten werden und der Server kann Inhalte pushen, was ich vor langer Zeit mit der Verwendung getan habe multipart/x-mixed-replace aber das hat im IE nicht funktioniert.

Ich denke, dass man mit Polling clevere Dinge tun kann, die dafür sorgen, dass es eher wie Push funktioniert, indem man keine unveränderten Header des Inhalts sendet, sondern die Verbindung offen lässt, aber ich habe das noch nie gemacht.

Probieren Sie es mal bei uns aus Kometenkomponente - obwohl es so ist äußerst Experimental...!

Bitte überprüfen Sie diese Bibliothek https://github.com/SignalR/SignalR Sie wissen, wie Sie Daten dynamisch an Clients weiterleiten, sobald sie verfügbar sind

Sie können auch einen Blick darauf werfen Java-Pushlets wenn Sie JSP-Seiten verwenden.

Vielleicht möchten Sie es sich ansehen ReverseHTTP Auch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top