1. sse概述
- 概念:
H5支持使用JS脚本不间断的访问服务器(推送)
- 轮询:
页面使用js的定时器,定时发送请求查询最新数据
使用js将最新数据加载至页面
每发送一次数据,需要建立新的连接
时间间隔由客户端决定
优点:不需要刷新页面、实时更新
缺点:定时器时间间隔间隔太长:数据不及时间隔太短:服务器压力太大
- SSE基于长轮询:
建立一次连接即可
连接断开会自动重连(需要保证客户端没关闭)
只能从服务器发送数据到客户端
SSE实现比较简单
时间间隔由服务器决定
- SSE流程:
客户端发送消息到服务器
服务器发送数据到客户端(业务数据、间隔时间)
存在阻塞(接收到服务器发过来的数据才能开始下一次请求)
- 原理(流):
严格地说,HTTP 协议无法做到服务器主动推送信息。
但是,有一种变通方法,就是服务器向客户端声明,
接下来要发送的是流信息(streaming)。
也就是说,发送的不是一次性的数据包,而是一个数据流,
会连续不断地发送过来。这时,客户端不会关闭连接,
会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。
本质上,这种通信就是以流信息的方式,完成一次用时很长的下载。
SSE 就是利用这种机制,使用流信息向浏览器推送信息。
它基于 HTTP 协议,目前除了 IE/Edge,其他浏览器都支持
2. sse代码实现
- js
<script>var source=new EventSource("地址");source.onmessage=function(e){};$(source).on("message",function(e){var data=e.data;});</script>
- 服务器servlet为例
String data="data:数据内容\n\n"; String retry="retry:毫秒数\n\n"; response.setContentType("text/event-stream");response.setCharacterEncoding("utf-8");OutputStream out=response.getOutputStream();out.write(data.getBytes("utf-8"));out.write(retry.getBytes("utf-8"));out.close();
3. 总结
取代了计时器不断访问服务器,由服务器控制访问的时间。
sse的取代品websocket。