Server-sent Events (SSE) 是一种基于 HTTP 的推送技术,它允许服务端向客户端实时推送数据。相比于传统的轮询方式,SSE 能够提供更加高效、实时的数据传输方式,因此在现代 Web 应用中得到了广泛的应用。
架构设计
SSE 的架构设计主要包括以下几个部分:
- 服务端:负责向客户端推送数据,并维护推送连接。
- 客户端:接收服务端推送的数据,并进行相应的处理。
- 连接:服务端和客户端之间的连接,用于实时传输数据。
其中,服务端和客户端的交互方式如下:
- 客户端向服务端发送一个 HTTP 请求,请求中包含一个特殊的头部
Accept: text/event-stream。 - 服务端接收到请求后,返回一个包含
Content-Type: text/event-stream头部的响应,表示这是一个 SSE 连接。 - 服务端不断向客户端发送数据,每个数据包都是以
data:开头的一行文本,后面跟着一些可选的字段,如event:和id:。 - 客户端接收到数据后,可以进行相应的处理,如更新页面内容等。
注意,SSE 只能由服务端向客户端推送数据,客户端无法主动向服务端发送消息。
设计思路
SSE 的设计思路主要包括以下几个方面:
1. 连接维护
SSE 采用长连接的方式,需要服务端维护连接状态。当客户端断开连接或者连接超时时,服务端需要及时关闭连接并释放资源,避免资源浪费。
2. 数据格式
SSE 使用文本格式传输数据,可以在数据前面添加一些可选的字段,如 event: 和 id:,以便客户端对数据进行更加灵活的处理。
3. 重连机制
SSE 连接可能会因为网络问题等原因中断,客户端需要能够自动重连。服务端需要在连接断开时及时通知客户端,以便客户端进行重连操作。
4. 跨域支持
由于 SSE 是基于 HTTP 的,因此需要考虑跨域问题。服务端需要在响应头中设置 Access-Control-Allow-Origin 字段,允许跨域访问。
示例代码
下面是一个简单的 SSE 示例代码:
服务端代码
// www.javascriptcn.com code example
const http = require('http');
http.createServer((req, res) => {
if (req.url === '/events') {
res.writeHead(200, {
'Content-Type': 'text/event-stream', // 指定响应类型为 SSE
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
setInterval(() => {
const data = new Date().toISOString();
res.write(`data: ${data}\n\n`); // 发送数据
}, 1000);
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(`
<html>
<head>
<title>SSE Example</title>
</head>
<body>
<h1>SSE Example</h1>
<div id="output"></div>
<script>
const output = document.getElementById('output');
const eventSource = new EventSource('/events'); // 创建 SSE 连接
eventSource.onmessage = (event) => {
output.innerHTML += event.data + '<br>'; // 显示数据
};
</script>
</body>
</html>
`);
}
}).listen(3000);客户端代码
// www.javascriptcn.com code example
<!DOCTYPE html>
<html>
<head>
<title>SSE Example</title>
</head>
<body>
<h1>SSE Example</h1>
<div id="output"></div>
<script>
const output = document.getElementById('output');
const eventSource = new EventSource('/events'); // 创建 SSE 连接
eventSource.onmessage = (event) => {
output.innerHTML += event.data + '<br>'; // 显示数据
};
</script>
</body>
</html>在上面的示例中,服务端会每秒向客户端发送当前时间,客户端会将接收到的数据显示在页面上。可以通过访问 http://localhost:3000 来查看效果。
学习与指导意义
SSE 是一种非常常用的实时数据传输技术,在很多现代 Web 应用中都得到了广泛的应用。通过学习 SSE 的架构与设计思路,可以更好地理解 SSE 技术的实现原理,从而更好地应用 SSE 技术来解决实际问题。
在实际应用中,需要注意 SSE 的一些限制,如无法进行双向通信、无法传输大量数据等。因此,在选择使用 SSE 技术时需要根据具体的场景来进行权衡。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d3922fa941bf71346cf735