서버 전송 이벤트는 서버가 이벤트 및 데이터를 클라이언트에 전송하는 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:"에도 주의를 기울여야 합니다. 위 코드 태그:
event: 이 줄을 선언하는 데 사용되는 이벤트 유형을 나타냅니다. 브라우저가 데이터를 수신하면 해당 유형의 이벤트를 생성합니다.
data: 행에 데이터가 포함되어 있음을 나타냅니다. 데이터로 시작하는 줄은 여러 번 나타날 수 있습니다. 이 모든 행은 해당 이벤트에 대한 데이터입니다.
retry: 연결이 끊어진 후 다시 연결하기 전 브라우저의 대기 시간을 선언하는 데 이 줄이 사용됨을 나타냅니다.
id: 이벤트를 선언하기 위해 이 줄에서 사용하는 식별자(즉, 데이터의 수)를 나타내며 일반적으로 사용되지 않습니다.
위는 Server-sented Events의 간단한 적용입니다. 더 이상 효과를 표시하지 않겠습니다. 관심이 있으시면 직접 조작하시면 됩니다!
위 내용은 서버 푸시 이벤트 상세 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!