Kernpunkte
Content-type
(Wert text/event-stream
) und UTF-8-Zeichen zur Verfügung gestellt werden. Die Syntax für den Server zum Senden von Ereignissen umfasst Daten, Ereignisart, Ereigniskennung und Wiederholungsintervall. onmessage
nur für Anwendungen verwenden, die Nachrichtenereignisse senden), aber die addEventListener
-Methode ist flexibler für die Behandlung benutzerdefinierter Ereignisse. Angenommen, das nationale Basketballteam Ihres Landes nimmt an der Weltbasketball -Meisterschaft teil. Sie möchten dem Spiel folgen, aber Sie können es nicht sehen, weil die Spielzeit mit Ihren Arbeitszeiten in Konflikt steht.
Zum Glück hat Ihr nationaler Nachrichtenservice ein sehr herausragendes Webentwicklungsteam. Sie erstellten ein Sportinformations -Scrolling -Display, das aktualisiert wird, wenn ein Foul oder eine Punktzahl auftritt. Wenn Sie eine URL besuchen, wird das Update direkt in Ihren Browser weitergegeben. Natürlich möchten Sie wissen, wie sie es gemacht haben. Die Antwort lautet: Der Server sendet das Ereignis.
Server -Send -Ereignisse ist eine Möglichkeit, einen Stream zu verwenden, um Daten und/oder DOM -Ereignisse vom Server zum Client zu verschieben. Es ist für Aktienzitate, Sportwerte, Flugverfolgung und E -Mail -Benachrichtigungen geeignet - jede Situation, in der Daten regelmäßig aktualisiert werden müssen.
Warten Sie!
Ich habe gehört, dass Sie sagen, Können wir dies nicht bereits mit XMLHTTPrequest oder WebSockets tun?
Ja, ja. Dies erfordert jedoch die Erweiterung dieser Objekte, um die Funktionalität von Eventsource selbst zu implementieren.
Da der Server Ereignisse sendet, sind Datenströme langfristige Verbindungen. Sie müssen einen Server verwenden, der eine große Anzahl gleichzeitiger Verbindungen verarbeiten kann. Natürlich sind ereignisorientierte Server besonders für Streaming-Ereignisse geeignet. Dazu gehören Node.js, Juggernaut und Twisted. Für Nginx können Sie das Nginx-Push-Stream-Modul verwenden. Die Serverkonfiguration liegt jedoch außerhalb des Rahmens dieses Artikels und hängt von dem von Ihnen verwendeten Server ab.
Lassen Sie uns sehen, wie Sie einen Stream mithilfe von EventSource -Objekten abonnieren. Dann werden wir sehen, wie Ereignisse gesendet und verarbeitet werden.
Ein EventSource -Objekt erstellen ist einfach.
var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:false});
Der EventSource -Konstruktor akzeptiert bis zu zwei Parameter:
withCredentials
das einzig mögliche Wörterbuchmitglied. Sein Wert kann wahr oder falsch sein. (Weitere Informationen zu Wörterbüchern finden Sie in der Web -IDL -Spezifikation.) withCredentials
Wenn die EventSource -Verbindung geöffnet ist, wird ein Ereignis ausgelöst. Wir können eine Funktion definieren, die das Ereignis übernimmt, indem wir die Eigenschaft
festlegen. open
onopen
var evtsrc = new EventSource('./url_of/event_stream/'); evtsrc.onopen = function(openevent){ // 连接打开时执行的操作 }
onerror
evtsrc.onerror = function(openevent){ // 发生错误时执行的操作 }
onmessage
evtsrc.onmessage = function(openevent){ // 接收到消息事件时执行的操作 }
addEventListener()
var onerrorhandler = function(openevent){ // 执行的操作 } evtsrc.addEventListener('error',onerrorhandler,false);
close()
evtsrc.close();
Ereignisse vom Server senden
Verwenden Sie den
Content-type
Verwenden Sie die UTF-8-Zeichenkodierung. text/event-stream
: Die zugesandte Nachricht.
data:
: Die Art des Ereignisses wird versandt. event:
: Die Ereigniskennung soll verwendet werden, wenn der Client wieder verbindet. id:
: Wie viele Millisekunden sollten passieren, bevor der Browser versucht, sich wieder mit der URL zu verbinden. retry:
Unter ihnen ist nur das Feld In diesem Beispiel werden wir eine Veranstaltung senden, um bekannt zu geben, welche Teams in unseren Turnierspielen spielen. Wenn der Browser diesen Text empfängt, sendet er ein Meldungsereignis.
var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:false});
data
wird zum Wert des data
-attributs des Nachrichtereignisses. Wie oben erwähnt, sendet der Server standardmäßig ein Ereignis, das ein Nachrichtenereignis ist. Aber wie wir später diskutieren werden, können wir auch benutzerdefinierte Ereignisse entsenden, indem wir das Feld event
einbeziehen.
Wir können auch mehrere Daten als einzelnes Ereignis senden. Jede Daten sollte von einem neuen Zeilencharakter (Line Newline, Wagenrendite oder beides) folgen. Hier fügen wir eine Veranstaltung hinzu, die diesen Spielort und diese Teilnahme enthält.
var evtsrc = new EventSource('./url_of/event_stream/'); evtsrc.onopen = function(openevent){ // 连接打开时执行的操作 }
Für dieses Ereignis wird der Wert des data
-attributs: Air Canada Centrentoronto, Ontario, Canadaattendance: 19.800 sein.
Bitte beachten Sie die leeren Zeilen zwischen den Ereignissen. Damit der Kunde eine Veranstaltung erhalten kann, muss die Veranstaltung von einer leeren Linie folgen. Kommentare beginnen mit einem Dickdarm.
Sofern wir nichts anderes angeben, ist die Art des Ereignisses eine Nachricht. Dazu müssen wir ein event
Feld einbeziehen. Im folgenden Beispiel werden wir unserem Stream zwei startingfive
Ereignisse hinzufügen und unsere Daten als Zeichenfolge im JSON -Format senden.
evtsrc.onerror = function(openevent){ // 发生错误时执行的操作 }
Hier müssen wir startingfive
Ereignisse anstelle von Nachrichtenereignissen anhören. Unser data
-Feld wird jedoch immer noch zum Wert der data
Eigenschaft des Ereignisses.
Wir werden die data
Eigenschaften und die MessageEvent -Schnittstelle im Abschnitt "Verarbeitung von Ereignissen" diskutieren.
Obwohl der Server Ereignisse in den Browser schiebt, ist die Realität subtiler. Wenn der Server die Verbindung geöffnet hält, ist die EventSource -Anforderung eine erweiterte Anfrage. Wenn es geschlossen ist, wartet der Browser einige Sekunden vor der Wiederverbindung. Wenn die URL beispielsweise ein Dateiend-Tag sendet, kann die Verbindung geschlossen werden.
Jeder Browser hat sein eigenes Standardintervall. Die meisten werden nach 3 bis 6 Sekunden wieder verbinden. Sie können dieses Intervall jedoch steuern, indem Sie das Feld retry
einbeziehen. Das Feld retry
gibt an, wie viele Millisekunden der Kunde warten sollte, bevor sie sich wieder mit der URL verbinden. Lassen Sie uns unser Ereignis aus dem obigen Beispiel erstellen und ändern, um ein 5 -Sekunden -Intervall (5000 Millisekunden) zu enthalten.
evtsrc.onmessage = function(openevent){ // 接收到消息事件时执行的操作 }
Ereignisströme können aktiv gehalten werden, solange der Client verbunden ist. Abhängig von Ihrer Architektur und Anwendung möchten Sie möglicherweise, dass der Server die Verbindung regelmäßig schließt.
Wenn der Browser wieder mit der URL verbunden ist, empfängt er alle Daten, die am Verbindungspunkt verfügbar sind. Für das Scrolling -Display für Spielinformationen möchten wir jedoch den Besucher wissen lassen, was er oder sie verpasst hat. Aus diesem Grund für die Bestätigung des ID für jedes Ereignis. Im folgenden Beispiel senden wir ID als Teil des Bewertungsereignisses.
var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:false});
Der Wert sollte für den Stream eindeutig sein. In diesem Fall verwenden wir die Zeit der Schussbewertung.
Das Feld id
wird zur lastEventId
Eigenschaft dieses Ereignisobjekts. Aber es hat einen anderen Zweck. Wenn die Verbindung geschlossen ist, enthält der Browser einen Last-Event-ID
-Header in seine nächste Anfrage. Betrachten Sie es als Lesezeichen für den Stream. Wenn der Header Last-Event-ID
vorhanden ist, können Sie die Antwort der Anwendung so anpassen, dass nur Ereignisse gesendet werden.
Wie oben erwähnt, sind alle Ereignisse für Nachrichtenereignisse standardmäßig. Jedes Nachrichtenereignis verfügt über drei Eigenschaften, die von der MessageEvent -Schnittstelle definiert sind.
onmessage
-Funktion aufgerufen. Dies eignet sich hervorragend für Anwendungen, die Sie nur Nachrichtenereignisse senden. Wenn Sie jedoch eine Punktzahl oder ein startingfive
-Ereignis senden möchten (wie in unserem Beispiel gezeigt), werden seine Grenzen offensichtlich. Flexibler mit addEventListener
. Im folgenden Code verwenden wir addEventListener
, um das Ereignis startingfive
zu verarbeiten.
var evtsrc = new EventSource('./url_of/event_stream/'); evtsrc.onopen = function(openevent){ // 连接打开时执行的操作 }
(zweiter Teil, stellen Sie aufgrund von Platzbeschränkungen bitte Fragen in Absätzen.)
Das obige ist der detaillierte Inhalt vonServer-Sent-Ereignisse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!