我需要在我的网站上发送事件以更新新闻动态,现在必须在WebSockets和SSE之间做出选择。
我倾向于使用SSE完成这项任务,因为我不需要允许用户向服务器发送事件,只需要让他们接收事件即可。
问题是:当从服务器发送事件时,SSE是否每次都会发送头信息,还是只有在连接创建时才发送头信息并仅发送事件内容?如果SSE每次发送事件时都会发送头信息,那么我应该使用WebSockets来减少带宽吗?
我需要在我的网站上发送事件以更新新闻动态,现在必须在WebSockets和SSE之间做出选择。
我倾向于使用SSE完成这项任务,因为我不需要允许用户向服务器发送事件,只需要让他们接收事件即可。
问题是:当从服务器发送事件时,SSE是否每次都会发送头信息,还是只有在连接创建时才发送头信息并仅发送事件内容?如果SSE每次发送事件时都会发送头信息,那么我应该使用WebSockets来减少带宽吗?
使用SSE,头部信息仅在连接创建时发送。之后,您只需根据需要向每个打开的连接发送事件数据即可。
对于单向流量,SSE通常比WebSockets使用更少的服务器资源,并且通过正常的http/https协议运行,降低了防火墙/网关问题的风险。甚至可以通过SSE和AJAX的组合实现群聊。
以下是一些Node.js示例代码:
const connections = [];
function connect(req, res) {
connections.push(res);
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Connection': 'keep-alive',
'Cache-Control': 'no-cache',
'X-Accel-Buffering': 'no'
});
req.on('close', () => {
connections.splice(connections.indexOf(res), 1);
});
}
function send(data) {
connections.forEach(c => c.write(`data:${JSON.stringify(data)}\n\n`));
}
Server-Sent Events官方规范: https://html.spec.whatwg.org/multipage/server-sent-events.html https://www.w3.org/TR/eventsource/
Marmelab的教程非常有用,因为它展示了如何为多个聊天室配置路由: https://marmelab.com/blog/2020/10/02/build-a-chat-application-using-sveltejs-and-sse.html
这是一个绝妙的演示,展示了如何将响应对象存储在数组中,而不需要其他标识符,并在连接关闭时删除。哇! Node.js如何比较响应?#哈希码? https://cri.dev/posts/2021-05-11-simple-server-sent-events-sse-eventsource-nodejs-javascript
DigitalOcean社区的众多好教程之一: https://www.digitalocean.com/community/tutorials/nodejs-server-sent-events-build-realtime-app
一个非常受欢迎的参考资料,附有关于通过EventSource.origin进行跨文档消息安全性的注释: https://www.html5rocks.com/en/tutorials/eventsource/basics/
注意压缩中间件: https://jasonbutz.info/2018/08/server-sent-events-with-node