ホームページ  >  記事  >  ウェブフロントエンド  >  (サーバー送信イベント) H5 のサーバー プッシュ イベントについての簡単な説明

(サーバー送信イベント) H5 のサーバー プッシュ イベントについての簡単な説明

巴扎黑
巴扎黑オリジナル
2017-08-05 14:37:361555ブラウズ

サーバー送信イベントは、サーバーがイベントとデータをクライアントに送信する WebSocket プロトコルに基づく一方向通信です。現在、Internet Explorer を除くすべての主要なブラウザがサーバー送信イベントをサポートしています。 2333...

WebSocket プロトコルは、HTTP プロトコルに次ぐサーバーとクライアントの通信プロトコルです。クライアントがサーバーに応答を要求する HTTP の単純な一方向通信モードとは異なり、サーバーとサーバー間の双方向通信をサポートします。クライアント。

サーバー送信イベントの使用

サーバー送信イベント (以下、SSE) をサーバー => クライアント通信方式として使用する場合、クライアントは対応するサービス アドレスと応答メソッド、およびサーバーを必要とします。対応するデータ送信方法が必要です。

クライアントサイド JS コード

次の JS コードを H5 ページに追加する必要があります:


     <script>
         if (typeof (EventSource) !== "undefined") {
             //推送服务接口地址
             var eventSource = new EventSource("http://localhost:2242/webservice/ServerSent/SentNews");
             //当通往服务器的连接被打开
             eventSource.onopen = function () {
                 console.log("连接打开...");
             }
              //当错误发生
              eventSource.onerror= function (e) {
                  console.log(e);
              };
              //当接收到消息,此事件为默认事件
              eventSource.onmessage = function (event) {
                  console.log("onmessage...");
               eventSource.close()//关闭SSE链接
              };
              //服务器推送sentMessage事件
              eventSource.addEventListener(&#39;sentMessage&#39;, function (event) { 
                  var data = eval(&#39;(&#39;+event.data+&#39;)&#39;);//服务器端推送的数据,eval装换Json对象
                  var origin = event.origin;//服务器 URL 的域名部分,即协议、域名和端口,表示消息的来源。
                  var lastEventId = event.lastEventId;////数据的编号,由服务器端发送。如果没有编号,这个属性为空。
                  //此处根据需求编写业务逻辑
                  console.log(data);              }, false);
          } else {
              //浏览器不支持server-sent events 所有主流浏览器均支持服务器发送事件,除了 Internet Explorer。
              document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
          }
      </script>

サーバー

サーバーはどのデータ形式を返す必要がありますか?クライアントにはどのような対応をすればよいのでしょうか?まずは .Net の例を見てみましょう


    /// <summary>
        /// 推送消息
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public HttpResponseMessage SentNews()
        {
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
            try
            {
                //response.Headers.Add("Access-Control-Allow-Origin", "*");//如需要跨域可配置
                string data_str = “推送至客户端的数据”;//当然可以是json字符串格式
                string even = "", data = "";
                if (!string.IsNullOrWhiteSpace(data_str))
                {
                    even = "event:sentMessage\n";
                    data = "data:" + data_str + "\n\n";
                }
                string retry = "retry:" + 1000 + "\n";//连接断开后重连时间(毫秒),其实可以理解为轮询时间 2333...
                byte[] array = Encoding.UTF8.GetBytes(even + data + retry);
                Stream stream_result = new MemoryStream(array);
                response.Content = new StreamContent(stream_result);
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/event-stream");//此处一定要配置
                response.Headers.CacheControl = new CacheControlHeaderValue();
                response.Headers.CacheControl.NoCache = false;
            }
            catch (Exception ex)
            {
                LogHelper.WriteWebLog(ex);
            }
            return response;
        }

上記のコードを読んだ後、応答メソッドは HTTPResponse 応答であることに変わりはありませんが、常にいくつかの小さな要件があります。

応答ヘッダー "Content - Type」を「text/event-stream」に設定します

応答データ形式では、上記のコードの「data:」、「event:」、および「retry:」タグにも注意する必要があります:

1.event: を示しますこの行が宣言するために使用されるイベントのタイプ。ブラウザがデータを受信すると、対応するタイプのイベントが生成されます。

2.data: 行にデータが含まれていることを示します。データで始まる行は複数回出現する場合があります。これらすべての行はそのイベントのデータです。

3.retry: この行は、接続が切断された後、再接続するまでのブラウザの待ち時間を宣言するために使用されることを示します。

4.id: この行がイベントを宣言するために使用する識別子 (つまり、データの番号) を示しますが、一般的には使用されません。

以上が(サーバー送信イベント) H5 のサーバー プッシュ イベントについての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。