>  기사  >  웹 프론트엔드  >  (서버 전송 이벤트) H5의 서버 푸시 이벤트에 대한 간략한 설명

(서버 전송 이벤트) H5의 서버 푸시 이벤트에 대한 간략한 설명

巴扎黑
巴扎黑원래의
2017-08-05 14:37:361555검색

서버 전송 이벤트는 서버가 이벤트 및 데이터를 클라이언트에 전송하는 WebSocket 프로토콜을 기반으로 하는 단방향 통신입니다. 물론 Internet Explorer를 제외한 모든 주요 브라우저는 현재 서버에서 보내는 이벤트를 지원합니다. 2333...

WebSocket 프로토콜은 HTTP 프로토콜 이후의 또 다른 서버-클라이언트 통신 프로토콜로, 클라이언트가 서버에 응답을 요청하는 HTTP의 단순한 단방향 통신 모드와 달리 서버와 클라이언트 간의 양방향 통신을 지원합니다. 고객.

Server-sent Events 사용

Server-sent Events(이하 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>

Server

서버는 어떤 데이터 형식을 반환해야 합니까? 고객에게 어떤 종류의 응답을 주어야 합니까? 먼저 .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 응답이지만 항상 몇 가지 작은 요구 사항이 있습니다.

Response 헤더 "Content - "text/event-stream"으로 설정하려면 "유형"을 입력하세요.

응답 데이터 형식은 위 코드의 "data:", "event:" 및 "retry:" 태그도 기록해야 합니다.

1.event: 이 줄을 사용하여 선언하는 이벤트 유형입니다. 브라우저가 데이터를 수신하면 해당 유형의 이벤트를 생성합니다.

2.data: 행에 데이터가 포함되어 있음을 나타냅니다. 데이터로 시작하는 줄은 여러 번 나타날 수 있습니다. 이 모든 행은 해당 이벤트에 대한 데이터입니다.

3.retry: 연결이 끊어진 후 다시 연결하기 전 브라우저의 대기 시간을 선언하는 데 이 줄이 사용됨을 나타냅니다.

4.id: 이벤트를 선언하기 위해 이 줄에서 사용하는 식별자(즉, 데이터의 수)를 나타내며 일반적으로 사용되지 않습니다.

위 내용은 (서버 전송 이벤트) H5의 서버 푸시 이벤트에 대한 간략한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.