Home > Article > Web Front-end > Detailed introduction to server push events
Server-sent Events are a one-way communication based on the WebSocket protocol in which the server sends events & data to the client. Currently all major browsers support server-sent events, except of course Internet Explorer. 2333...
The WebSocket protocol is another server-client communication protocol after the HTTP protocol. Unlike HTTP, which is a simple client requesting a server response, it supports a one-way communication mode. Two-way communication between server and client.
Use of Server-sent Events
Server-sent Events (hereinafter referred to as SSE) as the server=> For the client communication method, the client must have the corresponding service address and response method, and the server must have the corresponding data sending method; without further ado, let’s get to the code!
Client-side JS code
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-side
What data format should the server return? What kind of response should be given to the client? Let’s take a .Net example first
/// <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; }
After reading the above code, I think you should have an idea. The response method is still HTTPResponse response, but always A little request:
The response header "Content-Type" should be set to "text/event-stream"
The response data format should also pay attention to the "data:", "event:" and "retry:" tags in the above code:
event: Indicates the type of event this line is used to declare. When the browser receives data, it will generate events of the corresponding type.
data: Indicates that the row contains data. Lines starting with data can appear multiple times. All these rows are data for that event.
retry: Indicates that this line is used to declare the waiting time of the browser before reconnecting after the connection is disconnected.
id: Indicates the identifier (that is, the number of the data) used by this row to declare the event, which is not commonly used.
The above is a simple application of Server-sent Events. I will not show the effect anymore. If you are interested, you can operate it yourself to achieve the effect!
The above is the detailed content of Detailed introduction to server push events. For more information, please follow other related articles on the PHP Chinese website!