Tornado-SSEインタフェースを書く

1748 ワード

SSEの概要
サーバはクライアントにデータをプッシュし、多くのソリューションがあります.HTML 5には、「ポーリング」とWebSocketに加えて、Server-Sent Events(以下、SSEと略す)も用意されています.一般的に、HTTPプロトコルはクライアントがサーバに要求を開始するしかなく、サーバがクライアントに積極的にプッシュすることはできない.しかし、サーバがクライアントに宣言し、次に送信するストリーム情報(streaming)という特殊な状況があります.つまり、使い捨てのパケットではなく、1つのデータストリームが連続して送られてくるということです.このとき,クライアントは接続を閉じることなく,サーバからの新しいデータストリームをずっと待っている.本質的に、このような通信は情報をストリーミングする方式で、1回の時間の長いダウンロードを完成します.SSEはこのメカニズムを利用して,ストリーム情報を用いてブラウザに情報をプッシュする.HTTPプロトコルに基づいており、現在はIE/Edge以外のブラウザでサポートされています.[1]
コード#コード#
クライアント
リファレンスhttp://www.w3school.com.cn/html5/html_5_serversentevents.asp
サービス側

class ServerSentEvent(RequestHandler):

    def __init__(self, *args, **kwargs):
        super(ServerSentEvent, self).__init__(*args, **kwargs)
        self.set_header('Content-Type', 'text/event-stream')

    async def get(self):
        while True:
            if condition:
                self.out_put()
            time.sleep(2)

    def out_put(self):
        self.write('data:0

') self.flush()

説明する
SSEサービス・エンド・コードを完了するには、次の手順に従います.
  • はheadersにContent-Type: text/event-streamを追加し、このインタフェースがsseインタフェースであることを示す.
  • インタフェースにデッドサイクルを書き、サイクル中:
  • は、data:で始まり、

    で終わるデータを出力バッファに書き込む.
  • は、バッファデータを要求応答にリフレッシュする.


  • サービス側が起動すると、ブラウザを介してインタフェースにアクセスすると、要求は継続的にリフレッシュされ、条件conditionを満たす場合にdata:0が出力される.
    まとめ
    SSEにより、サービス側がある操作を受信した後(例えば、テストレポートをアップロードした)、SSEインタフェースにフロントエンドJSに特定のデータを送信するように通知し、JSがそのデータを受信した後、リフレッシュ操作を行い、新しく生成したデータをページにリフレッシュすることができる.
    実際には、SSEは、パフォーマンスの圧力をサービス側に移行し、クライアントブラウザのパフォーマンス消費を削減します.
    リファレンス
    [1]JavaScript標準リファレンスチュートリアル(alpha)、チェン一峰