客户端实现
客户端可以通过EventSource接口来接收来自服务器的事件,以下是常见的实现步骤:
<!DOCTYPE html>
<html>
<head>SSR Demo</title>
</head>
<body>
<script>
const eventSource = new EventSource('/events');
eventSource.onmessage = function(e) {
// 处理收到的事件数据
console.log('收到数据:', e.data);
// 更新页面或其他逻辑
};
</script>
</body>
</html>
服务器实现
在服务器端,配置一个路由来返回EventSource响应,以下是使用Node.js Express的示例:
const express = require('express');
const app = express();
// 配置必要的中间件
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// 定义路由
app.get('/events', function(req, res) {
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
// 创建事件流
const stream = res.createStream();
stream.on('data', function(chunk) {
stream.write(`data: ${chunk}\n`);
});
stream.on('finish', function() {
res.end();
});
// 处理客户端的发送数据
stream.on('connect', function() {
console.log('客户端连接成功');
});
stream.on('close', function() {
console.log('客户端关闭连接');
res.end();
});
stream.on('error', function(err) {
console.error('错误:', err);
res.end();
});
});
app.listen(300, function() {
console.log('服务器运行在localhost:300');
});
数据推送
服务器可以通过stream.write方法向客户端推送数据,每次写入时,数据以data: <data>\n的格式发送。
错误处理
在服务器端,处理错误、关闭和连接事件:
stream.on('error', function(err) {
console.error('错误:', err);
res.end();
});
stream.on('close', function() {
console.log('客户端关闭连接');
res.end();
});
跨域配置
在服务器配置中,允许客户端从不同域名访问:
app.use('events', express.allowCrossDomain);
注意事项
- 兼容性:SSR广泛支持现代浏览器。
- 数据格式:数据应以
text/event-stream格式发送。 - 连接管理:确保在客户端或服务器断开时正确释放资源。
通过以上方法,您可以实现服务器对客户端的实时推送,适用于需要单向数据推送的场景,如实时状态更新或动态内容加载。








