ホームページ  >  記事  >  ウェブフロントエンド  >  サーバープッシュイベントの詳細な紹介

サーバープッシュイベントの詳細な紹介

零下一度
零下一度オリジナル
2017-07-26 18:08:292060ブラウズ

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

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

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

サーバー送信イベント (以下、SSE) をサーバー => クライアント通信方式として使用する場合、クライアントは対応するサービス アドレスと応答メソッドを持っている必要があります。サーバー 対応するデータ送信メソッドがあるはずです。早速、コードに取り掛かりましょう。

クライアントJSコード

 H5页面需添加如下JS代码:     <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('sentMessage', function (event) { 
                  var data = eval('('+event.data+')');//服务器端推送的数据,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: イベントを宣言するためにこの行で使用される識別子 (つまり、データの番号) を示しますが、一般的には使用されません。

上記はサーバー送信イベントの簡単なアプリケーションです。これ以上は効果を示しません。興味がある場合は、自分で操作して効果を実現できます。

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

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