>  기사  >  웹 프론트엔드  >  H5 서버 푸시 이벤트에 대한 자세한 설명

H5 서버 푸시 이벤트에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-03-26 17:40:223083검색

이번에는 H5 서버 푸시 이벤트에 대해 자세히 설명하고, 서버 푸시 이벤트에 대한 주의사항은 무엇인지 살펴보겠습니다.

서버 전송 이벤트는 서버가 이벤트 및 데이터를 클라이언트에 전송하는 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>

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이지만 항상 몇 가지 작은 요구 사항이 있습니다.

응답 헤더 "Content-Type" 응답의 데이터 형식을 "text/event-stream"

으로 설정하면 위 코드에서 "data:", "event:" 및 "retry:" 태그도 확인해야 합니다.

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

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

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

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

이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!

추천 도서:

H5의 비디오 태그가 mp4 파일을 재생할 수 없는 문제를 해결하는 방법

H5 멀티스레딩(Worker SharedWorker) 자세한 설명

phonegap을 사용하여 연락처 복제 및 삭제

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

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