近在做大屏数据可视化项目时要求用图表实时展示最新数据变化,考虑到有大量的图表需要展示,因此轮询请求不予以考虑了,然后想到了支持全双工通信的 websocket。为了实时展示这些图表专门建立一个 websocket 连接也是可以的,然而总觉得杀鸡用牛刀了。知道查询到 Server-sent Event,顿时觉得这才是完美的解决方案。
什么是 Server-sent Event?
一个网页获取新的数据通常需要发送一个请求到服务器,也就是向服务器请求的页面。使用 server-sent Event,服务器可以在任何时刻向我们的 Web 页面推送数据和信息。这些被推送进来的信息可以在这个页面上作为 Events + data 的形式来处理。
严格地说,HTTP 协议无法做到服务器主动推送信息。但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。
也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。本质上,这种通信就是以流信息的方式,完成一次用时很长的下载。
SSE 就是利用这种机制,使用流信息向浏览器推送信息。它基于 HTTP 协议,目前除了 IE/Edge,其他浏览器都支持。
如何使用?
用 node 开启 sse 服务
var http = require("http");
http
.createServer(function (req, res) {
var fileName = req.url;
if (fileName === "/stream") {
res.writeHead(200, {
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
Connection: "keep-alive",
"Access-Control-Allow-Origin": "*",
});
res.write("retry: 10000\n");
res.write("event: connecttime\n");
res.write("data: " + "this is connecttime" + new Date() + "\n\n");
var interval = setInterval(function () {
res.write("event: getdata\n");
res.write("data: " + new Date() + "\n\n");
}, 1000);
req.connection.addListener(
"close",
function () {
clearInterval(interval);
},
false
);
}
})
.listen(8080, "127.0.0.1");
在 html 页面上开启 sse 并兼听事件
var source = new EventSource("http://127.0.0.1:8080/stream");
var div = document.getElementById("example");
source.onopen = function (event) {
div.innerHTML += "<p>Connection open ...</p>";
};
source.onerror = function (event) {
div.innerHTML += "<p>Connection close.</p>";
};
source.addEventListener(
"connecttime",
function (event) {
div.innerHTML += "<p>Start time: " + event.data + "</p>";
},
false
);
source.addEventListener("getdata", function (event) {
div.innerHTML += "<p>Data: " + event.data + "</p>";
});
此时在页面上可以看到从服务器发来源源不断的数据
参考文章:
原文链接: https://jesse121.github.io/blog/articles/2021/07/12.html
版权声明: 转载请注明出处.