情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでサーバ送信イベント(server-sent event)を受信する

サーバ送信イベントとは?

サーバ送信イベントserver-sent event)とはtext/event-stream形式でサーバからクライアントに送信されるイベントストリームです。

サーバ送信イベントの受信

サーバ送信イベントを受信するにはeventsourceモジュールのeventsourceクラスのコンストラクタを使用します。

var eventsource = require('eventsource');

var es = new eventsource('xxx', {
    headers: {
        aaa: 'aaa'
    }, 
    proxy: 'bbb'
});

第1引数に接続先のURLを指定します。

第2引数にオプションをオブジェクトとして指定します。

オプションには下のようなものがあります。

  • headers・・・HTTPリクエストヘッダフィールドをオブジェクトとして指定します。
  • proxy・・・HTTPプロキシのURLを指定します。

返り値としてeventsourceクラスのインスタンスが得られます。

このインスタンスは自動的に第1引数の接続先に接続し、イベントの受信を開始します。

このインスタンスでは下のようなイベントが発生します。

  • open・・・第1引数の接続先との接続が確立した時に発生します。
  • error・・・エラーが発生した時に発生します。

また、イベントを受信した際にはイベントの名称と同名のイベントが発生します。このイベントのイベントハンドラの第1引数はイベントを表すオブジェクトです。

また、このインスタンスでは下のような関数が提供されています。

  • close・・・接続先との接続を切断します。なお、この関数が呼び出されていない間は何らかの原因により接続先との接続が切断された場合には自動的に再接続を行います。

サンプルコード1

1つ目のコマンドライン引数として与えられたURLに接続し、サーバ送信イベントを受信します。

eventsource.js

var eventsource = require('eventsource');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

var es = new eventsource(process.argv[2]);
es.on('open', function () {
    console.log('opened.');
});
es.on('message', function (e) {
    console.log(e);
});
es.on('error', function (err) {
    console.log(err);
});

使用パッケージ

  • EventSource
    npm install eventsourceでインストールします。

実行結果

サーバ送信イベントを送信するサーバとして以前書いた「expressモジュールによるHTTPサーバ 番外編(1)サーバ送信イベント(server-sent event)」という記事のサンプルコード1(express-server-sse.js)を使用することにします。

express-server-sse.jsを実行するとHTTPサーバが起動します。

C:\work\node>node express-server-sse.js
http server is running...press enter key to exit.

この状態でコードを実行します。1つ目のコマンドライン引数はhttp://localhost:3000/とします。

C:\work\node>node eventsource.js http://localhost:3000/
opened.
MessageEvent {
  type: 'message',
  data: '0.45346930694425436',
  lastEventId: '',
  origin: 'http://localhost:3000' }
MessageEvent {
  type: 'message',
  data: '0.2469423823328869',
  lastEventId: '',
  origin: 'http://localhost:3000' }
MessageEvent {
  type: 'message',
  data: '0.9666503442386749',
  lastEventId: '',
  origin: 'http://localhost:3000' }
MessageEvent {
  type: 'message',
  data: '0.2508772057640165',
  lastEventId: '',
  origin: 'http://localhost:3000' }
MessageEvent {
  type: 'message',
  data: '0.4813850873967085',
  lastEventId: '',
  origin: 'http://localhost:3000' }

サーバ送信イベントが正しく受信されていることが分かります。

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js