| 目次 |
|---|
|
・Server-Sent Eventsとは ・Server-Sent Eventsの使い方 |
Server-Sent Eventsは、HTTP上で疑似サーバプッシュを行う場合のデータ形式とクライアントに関する仕組み(API)です。
つまり、サーバから送信(PUSH)されたイベントを受信する仕組みです。
これは、「Comet」(彗星)または「Long-Time Polling」と呼ばれる疑似サーバプッシュ技術です。
「Polling」(ポーリング)とは、定期的なリクエスト(要求)のリトライを繰り返すことです。
「Long-Time Polling」では、クライアントからポーリング処理を行うのですが、サーバ空のレスポンス(返事)を長時間終わらせないことで、レスポンスをサーバからの送信(PUSH)の経路として用いるものです。
Server-Sent Eventsは、この技術を標準化させたものと言えます。
「Web Socket」の方が、より本格的な双方向通信を実現する技術です。
しかし、Web Socketでは専用のサーバを必要とします。
Server-Sent Eventsは、既存のサーバサイド技術で実現が可能なため、手軽に利用が可能と言えます。
そのため、WEBサーバとFTPサーバなどしか使えないレンタルサーバでは、Web Socketは利用できない場合がありますが、Server-Sent Eventsなら利用が可能です。
Server-Sent Eventsは、2011年8月現在以下のブラウザで対応しています。
FireFox 6~、Safari 5~、Opera 10.62~、Google Chrome 6~
Server-Sent Eventsは、サーバからクライアントにプッシュするデータ形式が定められています。
データ形式はテキストですので、JavaやPHP、Perl、Ruby、Pythonあるいはシェルなど、既存のサーバサイド技術で対応が可能です。
MIMEタイプは、「text/event-stream」とします。
文字コードは、「UTF-8」です。
(内部文字コードが、shift_jisやEUC-JPのサーバでは文字コード変換が必要です。)
改行コードは、LF(\n)とCR(\r)のいずれの組み合わせでも対応します。
(「\r\n」、「\n」のみ、「\r」のみ)
「:」(コロン)で始まる行は、コメント行です。
空行と末尾は、イベント(送信)の区切りとなります。
行指向のデータ形式で、1行に「フィールド名:フィールド値」となるようにします。
1回の送信は、数行の「フィールド名:フィールド値」を1ブロックとして行います。
フィールド値の前には、空白を一つだけ挿入可です。
定義できるフィールド名は、以下の通りです。
リスト1. プッシュするデータ形式例
:コメント id: event1 data: data1 retry: 1000
EventSourceオブジェクトを生成することで、受信を開始します。
生成時の第1引数が、プッシュするサーバのURLです。
サーバからメッセージを受け取ると、EventSourceオブジェクトの「message」イベントが発生します。
EventSourceオブジェクトのプロパティは、以下の通りです。
EventSourceオブジェクトのメソッドは、以下の通りです。
EventSourceオブジェクトのイベントは、以下の通りです。
リスト2. 受信方法
// EventSourceオブジェクトを生成
var evtsrc = new EventSource("srv-sent.php");
// 受信結果の表示先を準備
var rcv = document.getElementById('rcv');
rcv.innerHTML = "受信を開始します。
";
// 受信回数のカウンタ
var cnt = 0;
// 受信イベントの処理
evtsrc.onmessage = function( evt ){
//結果の表示
rcv.innerHTML += cnt + ":" + evt.data + "
";
//リミッタ
if( cnt > 5 ){
evtsrc.close();
rcv.innerHTML += "受信終了
";
return;
}
cnt++;
}
実装例