主题
Server-Send Events (SSE)
特点
- 基于 http 协议
客户端
js
const source = new EventSource('https://example.com/xxx')
source.readyState
有有 3 种状态:
0
:未连接。等同于EventSource.CONNECTING
1
:已连接。等同于EventSource.OPEN
2
:已关闭。等同于EventSource.CLOSED
source 有 3 种事件:
onopen
:客户端与服务器建立连接时触发onmessage
:服务器向客户端推送消息时触发onerror
:客户端与服务器连接出错时触发
服务端
js
import http from 'node:http'
const server = http.createServer((req, res) => {
conset url = req.url
if(url === '/xxx') {
res.writeHead(200, {
"Access-Control-Allow-Origin": "*", // 允许跨域
"Content-Type": "text/event-stream", // 告诉客户端发送的是数据流
"cache-control": "no-cache", // 告诉客户端不要缓存数据
"Connection": "keep-alive", // 长连接
})
// 向客户端发送数据(SSE 有格式要求)
// 每一条数据 message 必须使用 \n\n 分割
// 每个 message 由若干行组成,格式:
// filed: value
// filed: id data retry event
res.write("retriy: 1000\n")
setInterval(() => {
res.write("data: hello world\n\n")
}, 5000)
}
})
server.listen(3000, () => {
console.log('server is running at http://localhost:3000')
})