Daten ohne Serveranforderung vom Server zum Client übertragen?


11

Ich habe beim Durchsuchen von Stack Exchange festgestellt, dass dynamische Benachrichtigungen wie "3 neue Nachrichten, zum Anzeigen klicken" angezeigt werden. Ich möchte diese Art der dynamischen Aktualisierung für das, was ich erklären werde.

Angenommen, ich möchte ein Karussell / eine Diashow mit 10 aktuellen Nachrichtenartikeln erstellen. Ich möchte, dass dieses Karussell stündlich in einer Warteschlange aktualisiert wird. Neuere Artikel schieben ältere Artikel aus der Warteschlange. Die Lösung auf meinem Kopf wäre.

  1. Benutzer meldet sich beim Client an.
  2. Der Client berechnet die Anzahl der Minuten bis zur nächsten Stunde und stellt einen Timer ein, der zur vollen Stunde ausgeführt werden soll.
  3. Senden Sie zur vollen Stunde eine Anfrage an den Server über neue Nachrichtenartikel, die noch nicht im Karussell waren.
  4. Antwort behandeln.
  5. Timer zurücksetzen.

Ist das eine akzeptable Strategie? Kann ich dies erreichen, ohne mich auf Kundenanfragen verlassen zu müssen? Mit anderen Worten, wie erreicht Stack Exchange seine dynamische Aktualisierung?


4
Schauen Sie sich SignalR an.
Robert Harvey

Ich empfehle Ihnen, sich über RSS und AJAX zu informieren. RSS ist ein Beispiel für ein Standardprotokoll für Abonnement-Feeds, und AJAX ist ein allgemeines Konzept zum Aktualisieren eines Clients (Browsers), ohne die Seite neu zu laden. Ich würde wetten, dass Stack Exchange so funktioniert.

1
@Snowman Stack Exchange verwendet WebSocket. Siehe meta.stackexchange.com/questions/10369/…
Robert Harvey

Ist der Client ein Browser, ein benutzerdefinierter Client oder etwas anderes?
Outis

Es ist etwas benutzerfeindlich, aber Sie können die HTML-Seite etwa alle 15 Minuten selbst aktualisieren lassen. Die meisten Nachrichten-Webseiten tun dies.
Gilbert Le Blanc

Antworten:


7

Um Daten zu pushen, müssten Sie einen Client identifizieren. Dazu müssen Sie den Client beim Server abonnieren. Sobald dies erledigt ist, haben Sie eine Liste der abonnierten Clients mit einer dauerhaften Verbindung.

Je nachdem, was Sie erreichen möchten, ist es für den Client am besten, eine Anforderung an den Server zu senden, damit Sie keine dauerhafte Verbindung aufrechterhalten und Anforderungs- / Antwortkommunikationsprotokolle als HTTP verwenden müssen.

Ein Beispiel für die Aufrechterhaltung einer dauerhaften Verbindung ist ein Live-Chat- / Instant-Messaging-System, da die Kommunikation in Echtzeit erfolgen sollte.

Denken Sie daran, dass dauerhafte Verbindungen normalerweise durch die Verwendung von socketsimplementiert werden. Dies fügt eine Überlagerung bei der Implementierung Ihres eigenen Kommunikationsprotokolls, Ihrer Verschlüsselung usw. hinzu.


2

Grundsätzlich müssen Sie Daten an den Client senden, und da eine bidirektionale Kommunikation nicht im Rahmen des http-Protokolls liegt, ist es nicht einfach, sie selbst zu implementieren.

Die Lösung Ihres Problems ist socket.io

Wie auf der Website angegeben,

"Socket.IO ermöglicht bidirektionale ereignisbasierte Echtzeitkommunikation. Es funktioniert auf jeder Plattform, jedem Browser oder jedem Gerät und konzentriert sich gleichermaßen auf Zuverlässigkeit und Geschwindigkeit."

Hoffe das wird dein Problem lösen.


7
Es wäre hilfreich, wenn Sie angeben, ob und wie Sie mit socket.io verbunden sind und wie dies zur Lösung des Fragestellerproblems auf der Grundlage Ihrer Kenntnisse / Erfahrungen mit dem Framework beitragen kann (im Gegensatz zu einem bloßen "Leitbild" der Website).
Benni

WebSockets sind Socket.IO jetzt strikt vorzuziehen, da alle gängigen Browser den Standard implementieren. Die meisten wichtigen Sprachen haben Websocket-Implementierungen, jedoch keine Socket.io-Implementierungen. Socket.io fügt den Nachrichten eine zusätzliche Struktur hinzu, sodass es auch nicht ohne weiteres kompatibel ist.
Alex Reinking

1

Ich kann nicht darüber sprechen, wie SE es macht, obwohl es, da es sich um eine Website handelt, verschiedene Möglichkeiten gibt, die einen Cron-Job beinhalten könnten, um ein PHP / Asp / What-Have-You-Skript zu jeder vollen Stunde auszuführen, um Daten zu pushen. Dies wäre jedoch der Fall, wenn Sie nach einer Nur-Web-Lösung suchen würden.

Da Sie jedoch einen Client erwähnen, können Sie möglicherweise eine Datei mit dem Datum und der Uhrzeit der letzten Nachrichtenaktualisierung für diesen Client erstellen und den Client den in dieser Datei gespeicherten Wert überprüfen lassen und ihn mit der Systemzeit des Benutzers vergleichen, um festzustellen, ob eine Stunde vergangen ist ist seit dem letzten Update vergangen. Wenn es mindestens eine Stunde her ist, fordert der Client den neuesten Nachrichtenstrom von Ihrem Server an, der dann den neuesten Nachrichtenstrom an den Client zurückgibt.

Ich würde es vermeiden, einen Timer oder zumindest nur einen Timer zu verwenden, da diese Methode nur funktionieren würde, wenn der Benutzer den Client offen hält, um den Timer am Laufen zu halten. Wenn Sie jedoch (auch) die Datei haben, wie ich vorgeschlagen habe, können Sie eine Unterroutine erstellen, um die Datei zu öffnen, die Zeit in einer Variablen zu speichern, sie mit der Systemzeit zu vergleichen und die Anforderung zu stellen, wenn sie mindestens eine Stunde gedauert hat. Dann rufen Sie einfach das Sub in Bezug auf bestimmte Ereignisse an. Ich würde es definitiv beim Laden des Formulars aufrufen, denn wenn der Benutzer gerade seinen Client neu startet, möchten Sie die neuesten Nachrichten. Wenn es ein paar Tage her wäre, seit sie auf dem Kunden waren, dann würde es so alte Nachrichten zeigen. Binden Sie dieses Sub im geringsten an die Client-Last und starten Sie den Timer wie von Ihnen vorgeschlagen.

Ich entschuldige mich, wenn ich falsch verstanden habe, was Sie wollten, da ich nicht ganz sicher bin, was Sie wollen. Aber hoffentlich gibt es hier etwas Wertvolles für Sie!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.