HTML5服务器推送事件(Server-sent-event)
HTML5服务器推送事件(Server-sent-event) 在前端开发中,实现界面推送的方式,这里大概总结下三种方式 轮询(ajax),比较耗费服务器资源。COMET方式(COMET 技术并不是 HTML 5 ) websocket 双向数据推送,灵活,功能强大 Server-sent-event(简称SSE),单项数据推送(Server-sent Events 规范是 HTML 5 规范的一个组成部分) 这里我们只讨论SSE SSE的本质:严格地说,HTTP协议无法做到服务器主动推送信息。但是有一种变通的发光法,就是服务器向客户端声明,接下来要发送的是流信息,也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断的发送过来。这是客户端不会关闭连接,会一直等待服务器发过来的数据流,视频播放就是这样的例子。本质上这种通信就是以流信息的方式,完成一次用时很长的下载。 SSE就是利用这种机制,使用流信息想浏览器推送信息。它基于HTTP协议,除了IE/Edge,其他浏览器都支持 闲谈 在Web开发中,浏览器和服务器之间使用请求/响应的交互模式。浏览器发出请求,服务器根据请求来生成响应。这种交互方式,服务器端产生数据变化后不能及时的通知给浏览,只能在浏览器下次请求的时候,才能获取(对于某些对数据实时性要求很高的应用,这种延迟是不能接受的)。 使用浏览器原生的EventSource对象的一个比较大的问题是IE并不支持(为实现在IE上COMET或轮询,第二种使用polyfill技术) SSE的客户端API部署在EventSource对象上,使用之前检测浏览器是否支持SSE if(typeof(EventSource)!=="undefined") { // 浏览器支持 Server-Sent // 一些代码..... } else { // 浏览器不支持 Server-Sent.. } var source = new EventSource(url); // url可以在当前网址同域,也可以跨域,跨域时可以指定第二个参数withCredentials 表示是否一起发送Cookies > > EventSource的readyState 表明连接的当前状态,该属性只读 > > * 0: 相当于常量EventSource.CONNECTIONG 表示连接还未建立,或者断线正在重连 > * 1:相当于常量EventSource.OPEN 表示连接已经建立,可以接受数据 > * 2:相当于常量EventSource.CLOSED 表示连接已断,且不会重连 ### Server-sent Events {#toc_2} > Server-sent Events 规范是 HTML 5 规范的一个组成部分,该规范比较简单,主要由两部分组成: > > 第一部分:服务器端与浏览器之间的通讯协议 > > 第二部分:浏览器端可以提供JavaScript中使用EventSource对象。 > > 通讯协议是基于纯文本的简单协议 > > 服务器端响应的内容类型为:text/event-stream,响应文本内容可以看成是一个事件流,有不同的事件组成。 > > 每个事件由类型和数据两个部分组成,同时每个事件可以有一个可选的标识符。不同事件的内容之间通过仅包含回车符和换行符的空行来分隔。每个事件的数据可能由多行组成。 > > 清单1 > > > ``` `data: first event data: second event id: 100 event: myevent data: third event id: 101 : this is a comment data: fourth event data: fourth event continue ` 每个事件之间通过空行来分隔。对于每行来说,冒号(:)前面表示的该行的类型,冒号后面则是对应的值。 ...