WebSocket 与服务器发送事件
通常,我听到“WebSocket”这个术语的次数比“服务器发送事件”的次数多。
原因可能是WebSocket 的使用率更高,但并非总是理想的方法。
有时,服务器发送事件的方法更能解决问题并创建更好的应用程序。
为了找到正确的解决方案,理解两者的差异、局限性和理想情况至关重要。
有时,我们会因为认知偏差而无法做出正确的决定。
认知偏差是一种系统性思维错误,发生在人们处理和解读周围世界的信息时,会影响他们做出的决策和判断。
(图片来自https://uxdesign.cc/how-to-improve-experience-design-by-managing-cognitive-biases-d7b360d35b0a)
例如,如果我们使用 WebSocket 解决了一个问题,下次遇到类似的问题时,我们可能会认为这是正确的方法,而没有考虑全局,没有考虑到待解决问题的所有信息。
因此,深入了解机器人方法可以帮助我们减少认知偏差,做出最佳决策。
让我们尝试解释这两种方法及其特点。
WebSocket
它是一种计算机通信协议,通过单个 TCP 连接提供全双工通信通道(维基百科)。该协议于 2011 年标准化。
WebSocket 方法在许多环境和项目中得到使用,因为它具有许多好处和优点。
双向通信
客户端和服务器都可以向对方发送数据。
客户端与服务器建立 TCP 连接,并根据需要保持连接。
服务器和客户端都可以随时轻松关闭连接。
为了交换数据,需要进行握手过程来验证通信是否成功,如果一切正常,它们就可以使用自定义的 WebSocket 协议交换数据。
(图片来自: https: //www.onlyfullstack.com/polling-vs-server-sent-events-vs-websocket/)
优势
- 实时双向通信,连接可以从浏览器发送和接收数据(例如:聊天)。
- 一般不使用 XmlHttpRequest,并且每次都不会发送标头,因此可以减少发送到服务器的昂贵数据负载。
- 可以传输二进制数据和UTF-8格式。
限制
- 当连接终止时,WebSocket 不会自动恢复它们,您需要自己实现重新连接系统。
- 2011 年之前的浏览器不支持 WebSocket 连接。
- 一些具有数据包检查功能的企业防火墙在处理 WebSocket 时遇到困难。
- 它不能放在具有基于标头的安全性的基于容器的身份验证方法后面,它必须是查询参数(或者希望是基于令牌的身份验证,其中令牌是在 WebSocket 路径之外建立的)。
理想情况
- 聊天:客户端和服务器交换数据以发送和接收消息
- 多人游戏
- 协作编辑/编码
- 社交动态
- 体育更新
- …还有更多…
服务器发送事件
它是一种服务器推送技术,允许客户端通过 HTTP 连接从服务器接收自动更新。
它诞生于 2006 年 9 月 1 日,因此发布已经有一段时间了。
它提供了一种内存高效的 XHR 流式传输实现。
与原始 XHR 连接(会缓冲完整的接收响应直到连接断开)不同,SSE 连接可以丢弃已处理的消息,而不会将所有消息累积到内存中。
单向通信
客户端发送请求来订阅特定频道,服务器将向该请求发送事件/数据,因此只有服务器可以发送数据,并且客户端会在同一个 HTTP 连接中自动接收这些事件。
(图片来自: https: //www.onlyfullstack.com/polling-vs-server-sent-events-vs-websocket/)
优势
- 通过简单的 HTTP 而不是自定义协议进行传输
- 更简单的协议
- 内置对重新连接和事件 ID 的支持
- 企业防火墙进行数据包检查没有问题
限制
- 它仅限于 UTF-8 并且不支持二进制数据。
- 如果不使用 HTTP/2,服务器发送事件方法会受到最大打开连接数的限制。当打开多个标签页时,这种情况会尤其严重,因为限制是针对每个浏览器的,而且设置得非常低(6)。
- 它是单向的
- 它没有原生浏览器支持。不过,可以使用 JavaScript 中的 poly-fill(复制 API)来模拟 SSE 功能,从而解决这个问题。所有现代浏览器都支持服务器发送事件:Firefox 6+、Google Chrome 6+、Opera 11.5+、Safari 5+、Microsoft Edge 79+。
理想情况
- 股票客户端更新:当股票价值发生变化时,客户端从服务器接收更新
- Twitter 推送更新:每次发送新推文时,客户端都会收到一条新推文
- 推送通知
结论
总而言之,这两种方法都是有效的,可以用来构建特定的软件。WebSocket
的使用更为广泛,也可以用来开发支持服务器发送事件的应用程序。
服务器发送事件的理想情况较少,但对于它们来说,它非常有用,因为它需要的配置更少,创建更新系统所需的时间也更少。
我已经使用过它们两个,没有一个比另一个更好,这取决于具体情况以及您当时的需求。
了解 WebSocket 和服务器发送事件可以帮助您决定哪种方法更适合每个应用程序。
文章来源:https://dev.to/minompi/websocket-vs-server-sent-events-2b77