服务器发送事件(Server-Sent Events)是否在每次从服务器发送事件时都会发送头信息,还是只在创建连接时发送?

3

我需要在我的网站上发送事件以更新新闻动态,现在必须在WebSockets和SSE之间做出选择。

我倾向于使用SSE完成这项任务,因为我不需要允许用户向服务器发送事件,只需要让他们接收事件即可。

问题是:当从服务器发送事件时,SSE是否每次都会发送头信息,还是只有在连接创建时才发送头信息并仅发送事件内容?如果SSE每次发送事件时都会发送头信息,那么我应该使用WebSockets来减少带宽吗?

1个回答

2

使用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


你能分享一下你回答的依据资源吗? - Melody
添加到我的答案中! - Walter Monroe
那么这是否意味着我不能使用SSE动态更改我的Cookie?我希望为每个间隔在响应头中设置一个Cookie。 - JAS MAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接