>웹 프론트엔드 >H5 튜토리얼 >서버 푸시 이벤트 상세 소개

서버 푸시 이벤트 상세 소개

零下一度
零下一度원래의
2017-07-26 18:08:292103검색

서버 전송 이벤트는 서버가 이벤트 및 데이터를 클라이언트에 전송하는 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: 이벤트를 선언하기 위해 이 줄에서 사용하는 식별자(즉, 데이터의 수)를 나타내며 일반적으로 사용되지 않습니다.

위는 Server-sented Events의 간단한 적용입니다. 더 이상 효과를 표시하지 않겠습니다. 관심이 있으시면 직접 조작하시면 됩니다!

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

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