服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE)。
SSE(Server-Sent Events)是一种用于实现服务器主动向客户端推送数据的技术,也被称为“事件流”(Event Stream)。它基于 HTTP 协议,利用了其长连接特性,在客户端与服务器之间建立一条持久化连接,并通过这条连接实现服务器向客户端的实时数据推送。
hml:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>SSE Client</title> </head> <body> <h1>Server-Sent Events Demo</h1> <button id="stop" onclick='stopEvents()'>停止</button> <div id="result"></div> <script> let evtSource=null function start(){ if (!!window.EventSource) { evtSource = new EventSource('http://192.168.1.22:8080/events'); evtSource.onmessage = function(e) { document.getElementById('result').innerHTML = e.data + '<br>' + document.getElementById('result').innerHTML; }; evtSource.onerror = function(e) { console.error('EventSource failed:', e); evtSource.close(); }; } else { console.log("Your browser doesn't support Server-Sent Events"); } } function stopEvents() { if (evtSource) { evtSource.close(); // 调用 close 方法停止接收事件 evtSource = null; // 可选:将 evtSource 设置为 null,以表明连接已关闭 } } start() </script> </body> </html>
服务器端代码,用的node:
const http = require('http'); const server = http.createServer((req, res) => { if (req.url === '/events') { // 设置内容类型为 text/event-stream res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Access-Control-Allow-Origin':'*', 'Access-Control-Allow-Headers':'Origin, X-Requested-With, Content-Type, Accept', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); // 每隔一定时间向客户端发送消息 const interval = setInterval(() => { const message = `data: ${new Date().toLocaleTimeString()}\n\n`; res.write(message); }, 1000); // 监听客户端关闭连接,停止发送数据 req.on('close', () => { clearInterval(interval); res.end(); }); } else { res.writeHead(404); res.end('Not Found'); } }); server.listen(8080, () => { console.log('SSE server is running on http://localhost:8080'); });