SSE EventSource

服务端事件EventSource揭秘

SSE eventSource简单介绍

20行代码写一个数据推送服务

服务端推

服务端推,指的是由服务器主动的向客户端发送消息(响应)。在应用层的HTTP协议实现中,“请求-响应”是一个round trip,它的起点来自客户端,因此在应用层之上无法实现简易的服务端推功能。当前解决服务端推送的方案有这几个:

  1. 客户端长轮询
  2. websocket双向连接
  3. iframe永久帧

长轮询虽然可以避免短轮询造成的服务端过载,但在服务端返回数据后仍需要客户端主动发起下一个长轮询请求,等待服务端响应,这样仍需要底层的连接建立而且服务端处理逻辑需要相应处理,不符合逻辑上的流程简单的服务端推送;

websocket连接相对而言功能最强大,但是它对服务器的版本有要求,在可以使用websocket协议的服务器上尽量采用此种方式;

iframe永久帧则是在在页面嵌入一个专用来接受数据的iframe页面,该页面由服务器输出相关信息,如,服务器不停的向iframe中写入类似的script标签和数据,实现另一种形式的服务端推送。不过永久帧的技术会导致主页面的加载条始终处于“loading”状态,体验很差。

HTML5规范中提供了服务端事件EventSource,浏览器在实现了该规范的前提下创建一个EventSource连接后,便可收到服务端的发送的消息,这些消息需要遵循一定的格式,对于前端开发人员而言,只需在浏览器中侦听对应的事件皆可。

相比较上文中提到的3中实现方式,EventSource流的实现方式对客户端开发人员而言非常简单,兼容性上出了IE系的浏览器(IE、Edge)外其他都良好;对于服务端,它可以兼容老的浏览器,无需upgrade为其他协议,在简单的服务端推送的场景下可以满足需求。在浏览器与服务端需要强交互的场景下,websocket仍是不二的选择。


            EventSource接口用于接收服务器发送的事件。它通过HTTP连接到一个服务器,以text/event-stream格式接收事件,不关闭连接。


属性

此接口从其父接口EventTarget继承属性。

EventSource.onerror
是一个  EventHandler,当发生错误时被调用,并且在此对象上派发  error 事件。
EventSource.onmessage
是一个  EventHandler,当收到一个  message事件,即消息来自源头时被调用。
EventSource.onopen
是一个  EventHandler,当收到一个  open 事件,即连接刚打开时被调用。
EventSource.readyState 
一个   unsigned  short  值,代表连接状态。可能值是 CONNECTING  ( 0 ),  OPEN  ( 1 ),  或者CLOSED  ( 2 )。
EventSource.url 

 一个DOMString,代表源头的URL。


方法

此接口从其父接口EventTarget继承方法。

EventSource.close()

如果存在,则关闭连接,并且设置readyState 属性为 CLOSED。如果连接已经被关闭,此方法不做任何事。


SSE (Server-Sent Events) 是一种用于实现服务器向客户端推送实时数据的技术,它基于HTTP协议,使用长连接来保持客户端和服务器之间的通信,并且服务器可以随时向客户端推送数据EventSource 是一个 JavaScript API,用于接收 SSE 服务器端推送数据,并将其呈现给用户。使用 EventSource API,可以在客户端创建一个 SSE 连接,并监听服务器端推送的事件。当服务器端有新数据时,EventSource 会自动接收并触发相应的事件,从而实现实时输出。 以下是 SSEEventSource 的使用示例: 1. 服务器端: ```python from flask import Flask, Response app = Flask(__name__) @app.route('/stream') def stream(): def event_stream(): for i in range(10): yield 'data: %s\n\n' % i return Response(event_stream(), mimetype="text/event-stream") ``` 2. 客户端: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>SSE Demo</title> </head> <body> <ul id="msg-list"> </ul> <script> var source = new EventSource("/stream"); source.onmessage = function(event) { var node = document.createElement("LI"); var textnode = document.createTextNode(event.data); node.appendChild(textnode); document.getElementById("msg-list").appendChild(node); }; </script> </body> </html> ``` 在上述示例中,服务器端使用 Flask 框架创建一个 SSE 连接,每隔一秒钟推送一个数据,客户端使用 EventSource API 创建一个 SSE 连接,并监听服务器端推送数据,将数据添加到页面上的列表中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值