站長資訊網
        最全最豐富的資訊網站

        服務器推送事件的詳細介紹

        服務器推送事件(Server-sent Events)是基于WebSocket 協議的一種服務器向客戶端發送事件&數據的單向通訊。目前所有主流瀏覽器均支持服務器發送事件,當然除了 Internet Explorer 。2333…

        WebSocket 協議是繼HTTP協議后又一服務器客戶端通訊協議,不同于HTTP單純的客戶端請求服務器響應單向通訊模式的是它支持了服務端客戶端的雙向通訊。

        Server-sent Events 的使用

        Server-sent Events(以下簡稱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:sentMessagen";                      data = "data:" + data_str + "nn";                  }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:表示該行包含的是數據。以 data 開頭的行可以出現多次。所有這些行都是該事件的數據。

        3. retry:表示該行用來聲明瀏覽器在連接斷開之后進行再次連接之前的等待時間。

        4. id:表示該行用來聲明事件的標識符(即數據的編號),不常用。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲一区精品伊人久久伊人 | 国内精品久久久久伊人av| 国产精品亚洲精品| 亚洲欧洲精品成人久久奇米网| 欧美性videofree精品| 久久香综合精品久久伊人| 精品欧美一区二区在线观看| 国产精品一区在线播放| 亚洲国产另类久久久精品黑人 | 一本色道久久88—综合亚洲精品 | 精品卡一卡二卡乱码高清| 青春草无码精品视频在线观| 久久久精品一区二区三区| 久久99精品久久久久久久不卡 | 国产精品日韩欧美久久综合| 99热亚洲色精品国产88| 亚洲国产第一站精品蜜芽| 免费精品国自产拍在线播放| 91精品国产91久久久久久| 91探花福利精品国产自产在线 | avtt天堂网久久精品| 无码日韩精品一区二区免费| 久久青青草原精品国产不卡| 亚洲精品人成在线观看| 国产精品久久久久久影院| 国产乱码精品一品二品| 奇米影视7777久久精品| 亚洲色精品vr一区二区三区| 欧美精品亚洲人成在线观看| 国产在线精品国自产拍影院| 国产成人精品免高潮在线观看| 久久久精品午夜免费不卡| 国产成人精品日本亚洲11| 992tv精品视频tv在线观看| 久久久久久亚洲精品成人| 中文字幕精品无码一区二区三区| 久久精品这里只有精99品| 久草热久草热线频97精品| 久久久久国产精品麻豆AR影院 | 四虎成人精品| 亚洲精品无码AV中文字幕电影网站|