Websockets 和 SSE(服务器发送事件)都能够将数据推送到浏览器,但它们不是竞争技术。
Websockets 连接既可以向浏览器发送数据,也可以从浏览器接收数据。可以使用 websocket 的应用程序的一个很好的例子是聊天应用程序。
SSE 连接只能将数据推送到浏览器。在线股票报价或更新时间线或提要的 Twitter 是可以从 SSE 中受益的应用程序的很好示例。
在实践中,由于 SSE 可以完成的所有事情也可以通过 Websockets 完成,因此 Websockets 得到了更多的关注和喜爱,并且比 SSE 更多的浏览器支持 Websockets。
但是,对于某些类型的应用程序来说,这可能有点过头了,而且使用 SSE 等协议(protocol)可以更轻松地实现后端。
此外,SSE 可以被 polyfill 到不支持原生浏览器的旧浏览器中,只使用 JavaScript。 SSE polyfill 的一些实现可以在 Modernizr github page 上找到。 .
陷阱:
- SSE 受到最大打开连接数的限制,当打开各种选项卡时可能会特别痛苦,因为限制是 每个浏览器 并且设置为非常低的数字 (6)。该问题已在 Chrome 中标记为“无法修复”和 Firefox .此限制是针对每个浏览器 + 域的,这意味着您可以在所有选项卡上打开 6 个 SSE 连接到
www.example1.com
和另外 6 个 SSE 连接到 www.example2.com
(感谢 Phate)。
- 只有 WS 可以同时传输二进制数据和 UTF-8,SSE 仅限于 UTF-8。 (感谢 Chado Nihi)。
- 一些具有数据包检测功能的企业防火墙无法处理 WebSocket(Sophos XG Firewall、WatchGuard、McAfee Web Gateway)。
HTML5Rocks有一些关于 SSE 的好信息。从该页面:
Server-Sent Events vs. WebSockets
Why would you choose Server-Sent Events over WebSockets? Good question.
One reason SSEs have been kept in the shadow is because later APIs like WebSockets provide a richer protocol to perform bi-directional, full-duplex communication. Having a two-way channel is more attractive for things like games, messaging apps, and for cases where you need near real-time updates in both directions. However, in some scenarios data doesn't need to be sent from the client. You simply need updates from some server action. A few examples would be friends' status updates, stock tickers, news feeds, or other automated data push mechanisms (e.g. updating a client-side Web SQL Database or IndexedDB object store). If you'll need to send data to a server, XMLHttpRequest is always a friend.
SSEs are sent over traditional HTTP. That means they do not require a special protocol or server implementation to get working. WebSockets on the other hand, require full-duplex connections and new Web Socket servers to handle the protocol. In addition, Server-Sent Events have a variety of features that WebSockets lack by design such as automatic reconnection, event IDs, and the ability to send arbitrary events.
TLDR 总结:
SSE 相对于 Websockets 的优势:
- 通过简单的 HTTP 而不是自定义协议(protocol)传输
- 可以用 javascript 填充以将 SSE“反向移植”到尚不支持它的浏览器。
- 内置支持重新连接和事件 ID
- 更简单的协议(protocol)
- 企业防火墙进行数据包检查没有问题
Websockets 相对于 SSE 的优势:
SSE 的理想用例:
SSE 陷阱:
我是一名优秀的程序员,十分优秀!