WebSockets
这部分参考文档涵盖了对 Servlet 栈的支持、WebSocket 消息传递(包括原始 WebSocket 交互)、通过 SockJS 的 WebSocket 模拟,以及通过 STOMP 作为 WebSocket 的子协议进行的发布-订阅消息传递。
WebSocket 简介
WebSocket 协议,RFC 6455,提供了一种标准化的方法,通过单个 TCP 连接在客户端和服务器之间建立全双工的双向通信通道。它是一个不同于 HTTP 的 TCP 协议,但被设计为可以在 HTTP 上工作,使用端口 80 和 443,并允许重用现有的防火墙规则。
WebSocket 交互始于一个 HTTP 请求,该请求使用 HTTP Upgrade
头来升级,或者在这种情况下,切换到 WebSocket 协议。以下示例展示了这样的交互:
GET /spring-websocket-portfolio/portfolio HTTP/1.1
Host: localhost:8080
Upgrade: websocket // <1>
Connection: Upgrade // <2>
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: http://localhost:8080
Upgrade
头。使用
Upgrade
连接。
支持 WebSocket 的服务器返回的输出类似于以下内容,而不是通常的 200 状态码:
HTTP/1.1 101 Switching Protocols // <1>
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp
协议切换
在成功握手后,HTTP 升级请求所基于的 TCP 套接字保持打开状态,以便客户端和服务器继续发送和接收消息。
关于 WebSockets 工作原理的完整介绍超出了本文档的范围。请参阅 RFC 6455、HTML5 的 WebSocket 章节或网络上的许多介绍和教程。
注意,如果 WebSocket 服务器在一个网络服务器(例如 nginx)后面运行,你可能需要配置它以将 WebSocket 升级请求传递给 WebSocket 服务器。同样,如果应用程序运行在云环境中,请查看云提供商关于 WebSocket 支持的相关说明。
HTTP 与 WebSocket
即使 WebSocket 被设计为与 HTTP 兼容并以 HTTP 请求开始,但重要的是要理解这两种协议会导致非常不同的架构和应用编程模型。
在 HTTP 和 REST 中,一个应用程序被建模为多个 URL。为了与应用程序交互,客户端以请求-响应的方式访问这些 URL。服务器根据 HTTP URL、方法和头信息将请求路由到适当的处理程序。
相比之下,在 WebSockets 中,通常只有一个用于初始连接的 URL。随后,所有应用程序消息都在同一个 TCP 连接上流动。这表明了一种完全不同的异步、事件驱动的消息传递架构。
WebSocket 也是一种低级传输协议,与 HTTP 不同,它不对消息内容规定任何语义。这意味着除非客户端和服务器就消息语义达成一致,否则无法路由或处理消息。
WebSocket 客户端和服务器可以通过 HTTP 握手请求中的 Sec-WebSocket-Protocol
头来协商使用更高级别的消息协议(例如,STOMP)。如果没有这一点,他们需要自行制定约定。
何时使用 WebSockets
WebSockets 可以使网页变得动态和交互。然而,在许多情况下,AJAX 和 HTTP 流或长轮询的组合可以提供一个简单而有效的解决方案。
例如,新闻、邮件和社交动态需要动态更新,但每隔几分钟更新一次可能完全可以接受。另一方面,协作、游戏和金融应用则需要更接近实时更新。
仅延迟不是决定性因素。如果消息量相对较低(例如,监控网络故障),HTTP 流或轮询可以提供有效的解决方案。正是低延迟、高频率和高容量的结合,才使得使用 WebSocket 成为最佳选择。
请记住,在互联网上,您无法控制的限制性代理可能会阻止 WebSocket 交互,可能是因为它们没有配置为传递 Upgrade
头,或者因为它们关闭了看似空闲的长连接。这意味着在防火墙内使用 WebSocket 进行内部应用程序比用于面向公众的应用程序更容易做出决定。
章节摘要
📄️ WebSocket API
在 Reactive 栈中查看等效内容
📄️ SockJS 回退机制
在公共互联网中,您无法控制的限制性代理可能会阻止 WebSocket 交互,可能是因为它们未配置为传递 Upgrade 头,或者因为它们关闭了看似空闲的长连接。
🗃️ STOMP
23 个项目