服务器发送事件(以下简称SSE)是HTML 5规范的一个组成部分,可以实现服务器到客户端的单向数据通信。通过SSE,客户端可以自动获取数据更新,而不用重复发送HTTP请求。一旦连接建立,“事件”便会自动被推送到客户端。服务器端SSE通过“事件流(Event Stream)”的格式产生并推送事件。事件流对应的MIME类型为“text/event-stream”,包含四个字段:event、data、id和retry。event表示事件类型,data表示消息内容,id用于设置客户端EventSource对象的“last event ID string”内部属性,retry指定了重新连接的时间。

node代码示例:

前端部分

var evtSource = new EventSource("http://localhost:3000");
let eventList = document.getElementsByTagName('body')[0]
// evtSource.onmessage = function(e) {
// console.log(1111,e);
// var newElement = document.createElement("li");
// const eventList = document.getElementsByTagName('body')[0]
// // console.log(eventList);
// newElement.innerHTML = "message: " + e.data;
// eventList.appendChild(newElement);
// } evtSource.addEventListener("ping", function(e) {
console.log(2222,e);
var newElement = document.createElement("li");
let eventList = document.getElementsByTagName('body')[0]
var obj = JSON.parse(e.data);
newElement.innerHTML = "ping at " + obj.date;
eventList.appendChild(newElement); }, false); evtSource.addEventListener("error",function(e){
console.log("服务器发送给客户端的数据为:" + e.data);
}); //只要和服务器连接,就会触发open事件
evtSource.addEventListener("open",function(){
console.log("和服务器建立连接");
}); //处理服务器响应报文中的load事件
evtSource.addEventListener("load",function(e){
console.log("服务器发送给客户端的数据为:" + e.data);
});

  服务端部分

const http = require('http')

http.createServer((req, res) => {
res.writeHead(200, {
'Content-Type' : 'text/event-stream',
'Access-Control-Allow-Origin':'*'
})
let i = 0;
const timer = setInterval(()=>{
const date = {date:new Date()}
var content = 'event: ping\n'+"data:"+JSON.stringify(date)+"" + "\n\n";
res.write(content);
},1000) res.connection.on("close", function(){
res.end();
clearInterval(timer);
console.log("Client closed connection. Aborting.");
}); }).listen(3000)
console.log('server is run http://localhost:3000');

  java的示例

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //媒体类型为 text/event-stream
response.setContentType("text/event-stream");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter(); //响应报文格式为:
//data:Hello World
//event:load
//id:140312
//换行符(/r/n) out.println("data:Hello World");
out.println("event:load");
out.println("id:140312");
out.println();
out.flush();
out.close();
}

  SSE相较于轮询具有较好的实时性,使用方法也非常简便。然而SSE只支持服务器到客户端单向的事件推送,而且所有版本的IE(包括到目前为止的Microsoft Edge)都不支持SSE。如果需要强行支持IE和部分移动端浏览器,可以尝试EventSource Polyfill(本质上仍然是轮询)

参考文章:

https://developer.mozilla.org/zh-CN/docs/Server-sent_events/Using_server-sent_events

后端数据推送-EventSource的更多相关文章

  1. flask+socketio+echarts3 服务器监控程序(基于后端数据推送)

    本文地址:http://www.cnblogs.com/hhh5460/p/7397006.html 说明 以前的那个例子的思路是后端监控数据存入数据库:前端ajax定时查询数据库. 这几天在看web ...

  2. javascript之数据推送

    我们使用ajax与后台服务进行交互,常常是通过触发事件来单次交互,但对于有些web应用来说,需要前台与后台保持长连接,前端不定时地接收后台推送的数据信息, 例如:股票行情分析.聊天室和网页在线游戏等. ...

  3. HTML5数据推送SSE原理及应用开发

    JavaScript表达行为,CSS表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数 ...

  4. HTML5 SSE 数据推送应用开发

    javascript表达行为,css表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数 ...

  5. 使用Node.js实现数据推送

    业务场景:后端更新数据推送到客户端(Java部分使用Tomcat服务器). 后端推送数据的解决方案有很多,比如轮询.Comet.WebSocket. 1. 轮询对于后端来说开发成本最低,就是按照传统的 ...

  6. HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)

    传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据 ...

  7. SSE技术详解:使用 HTTP 做服务端数据推送应用的技术

    SSE ( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议. 严格地说,HTTP 协议是没有办法做服务器推送的,但是当服务器向客户端声明接下来 ...

  8. kafka和websocket实时数据推送

    需求 ​ 已有Kafka服务,通过kafka服务数据(GPS)落地到本地磁盘(以文本文件存储).现要根据echarts实现一个实时车辆的地图. 分析 前端实时展现:使用websocket技术,实现服务 ...

  9. 理解HTML5数据推送应用开发问题

    一.数据推送 SSE是一种允许服务端向客户端推送新数据(通常称作数据推送)的HTML5技术.那么,究竟什么是数据推送?它与我们可能用过的其他技术有什么不同呢? 让我先来回答什么不是数据推送.数据推送有 ...

随机推荐

  1. Mysql命令收集【重要】

    1.在linux上获取Mysql服务器状态,及版本: [root@host]# mysqladmin --version 结果信息: mysqladmin  Ver 8.42 Distrib 5.7. ...

  2. ScriptManager(脚本控制器)

    资料中如实是说:       1, ScriptManager(脚本控制器)是asp.net ajax存在的基础.      2, 一个页面只允许有一个ScriptManager,并且放在其他ajax ...

  3. javascript中的toString()、toLocaleString()方法

    javascript中的toString()方法,主要用于Array.Boolean.Date.Error.Function.Number等对象.下面是这些方法的一些解析和简单应用,做个纪律,以作备忘 ...

  4. ob_start()、ob_get_contents() 等使用方法

    ob_start()ob_get_contents(); 获取缓冲区内容ob_end_clean():删除内部缓冲区的内容,并且关闭内部缓冲区 ob_end_flush() 发送内部缓冲区的内容到浏览 ...

  5. CentOS 6.5之SSH 免密码登录

    0.说明 这里为了方便说明问题,假设有A和B两台安装了centos6.5的主机.目标是实现A.B两台主机分别能够通过ssh免密码登录到对方主机.不同主机的配置过程一样,这里介绍A主机的配置过程. 事先 ...

  6. 左上角小猫猫直达博主GitHub \-_-/

    GitHub上有博主代码工程学习笔记啥的,由于推送比较方便所以有些学习笔记就没有上传到博客园

  7. 判断是否为PC

    function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", " ...

  8. Linux中的touch命令总结(一)

    touch命令有两个主要功能: 改变 timestamps 新建_空白_文件 例如,不带任何参数地输入: touch file1 file2 file3 将在当前目录下新建三个空白文件:file1, ...

  9. 禁止打开 F12 开发者工具

    禁止F12 window.onkeydown = window.onkeyup = window.onkeypress = function (event) { // 判断是否按下F12,F12键码为 ...

  10. Angular JS - 5 - Angular JS 模块和控制器

    1.引入 1.5版本的angularjs,直接打印angular对象: --> <!DOCTYPE html> <html> <head lang="en ...