コアポイント
Content-type
ヘッダー(valuetext/event-stream
)およびUTF-8文字エンコードを使用してコンテンツを提供する必要があります。サーバーがイベントを送信するための構文には、データ、イベントタイプ、イベント識別子、および再試行間隔が含まれます。 onmessage
関数(メッセージイベントを送信するアプリケーションのみ)を使用できますが、addEventListener
メソッドはカスタムイベントの処理に柔軟に対応します。 幸いなことに、ナショナルニュースサービスには非常に優れたWeb開発チームがあります。彼らは、ファウルやスコアが発生するたびに更新するスポーツ情報スクロールディスプレイを構築しました。 URLにアクセスすると、更新はブラウザに直接プッシュされます。もちろん、あなたは彼らがそれをどのようにしたかを知りたいと思うでしょう。答えは次のとおりです。サーバーはイベントを送信します。
サーバーの送信イベントは、ストリームを使用してサーバーからクライアントにデータやDOMイベントをプッシュする方法です。在庫の見積もり、スポーツスコア、フライトトラッキング、電子メール通知 - データを定期的に更新する必要がある状況に適しています。
待ってください! あなたが言うのを聞いた、
xmlhttprequestまたはwebsocketsを使用してこれをすでに行うことはできませんか? はい、はい。ただし、そうするためには、これらのオブジェクトを拡張して、Events Source自体の機能を実装する必要があります。
サーバー側での予防策
eventsourceオブジェクトを使用してストリームをサブスクライブする方法を見てみましょう。次に、イベントがどのように送信および処理されるかを確認します。
eventsourceオブジェクトを作成するのは簡単です。
var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:false});
eventSourceコンストラクターは、最大2つのパラメーターを受け入れます
withCredentials
withCredentials
辞書パラメーターは、ユーザー資格情報(Cookie)のクロスドメイン要求の場合にのみ必要です。これまでのところ、クロスドメインのEventsourceリクエストをサポートするブラウザはありません。したがって、この例には2番目のパラメーターは含まれません。
eventsource接続が開いている場合、
イベントがトリガーされます。プロパティを設定して、イベントを処理する関数を定義できます。 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();
サーバーからイベントを送信します
Content-type
text/event-stream
:送信されるメッセージ。
data:
event:
id:
retry:
フィールドのみが必要です。
var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:false});
フィールドの値は、メッセージイベントのdata
属性の値になります。上記のように、サーバーはデフォルトでイベントを送信しますメッセージイベントです。ただし、後で説明するように、data
フィールドを含めることでカスタムイベントを発送することもできます。 event
このイベントの場合、
var evtsrc = new EventSource('./url_of/event_stream/'); evtsrc.onopen = function(openevent){ // 连接打开时执行的操作 }
data
イベント間の空白線に注意してください。クライアントがイベントを受け取るためには、イベントの後に空白の行が必要です。コメントはコロンから始まります。
カスタムイベントを送信
event
startingfive
ここでは、メッセージイベントの代わりに
evtsrc.onerror = function(openevent){ // 发生错误时执行的操作 }
プロパティの価値になります。 startingfive
data
「処理イベント」セクションでdata
プロパティとMessageEventインターフェイスについて説明します。
接続を管理し、再接続data
フィールドを含めることができます。
フィールドは、URLに再接続する前にクライアントが待つ必要があるミリ秒数を示します。上記の例からイベントを構築して変更して、5秒(5000ミリ秒)の再試行間隔を含めましょう。
retry
クライアントが接続されている限り、イベントストリームはアクティブに保つことができます。アーキテクチャとアプリケーションに応じて、サーバーが定期的に接続を閉じることをお勧めします。 retry
IDフィールドを使用して、
evtsrc.onmessage = function(openevent){ // 接收到消息事件时执行的操作 }
ブラウザがURLに再接続すると、接続ポイントで利用可能なデータが受信されます。ただし、ゲーム情報スクロールディスプレイの場合、訪問者に見逃したものを知らせたい場合があります。これが、各イベントにIDを設定するためのベストプラクティスです。次の例では、スコアリングイベントの一部としてIDを送信しています。
var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:false});
値はストリームに固有のものでなければなりません。この場合、ショットスコアの時間を使用しています。
id
フィールドは、このイベントオブジェクトのlastEventId
プロパティになります。しかし、それには別の目的があります。接続が閉じられている場合、ブラウザには次のリクエストにLast-Event-ID
ヘッダーが含まれます。それをストリームのブックマークと考えてください。 Last-Event-ID
ヘッダーが存在する場合、アプリケーションの応答を調整して、それに続くイベントのみが送信されるようにすることができます。
上記のように、すべてのイベントはデフォルトのメッセージイベントになります。各メッセージイベントには、MessageEventインターフェイスで定義された3つのプロパティがあります。
onmessage
関数が呼び出されます。これは、メッセージイベントを送信するだけのアプリケーションに最適です。ただし、スコアまたはイベントを送信する場合(例に示すように)、その制限が明らかになります。 を使用してより柔軟に対応します。次のコードでは、startingfive
イベントを処理するためにaddEventListener
を使用しています。 addEventListener
startingfive
(2番目の部分、スペースの制限が原因で、段落で質問してください。)var evtsrc = new EventSource('./url_of/event_stream/'); evtsrc.onopen = function(openevent){ // 连接打开时执行的操作 }
以上がサーバーセントイベントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。