跳到主要内容
版本:7.0.3

WebSockets

Hunyuan 7b 中英对照 WebSockets

本参考文档的这一部分涵盖了Servlet栈的支持、WebSocket消息传递(包括原始的WebSocket交互)、通过SockJS实现的WebSocket仿真,以及通过WSGI协议中的STOMP子协议进行的发布-订阅消息传递。

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”连接。

与通常的200状态码不同,支持WebSocket的服务器会返回类似以下的输出:

HTTP/1.1 101 Switching Protocols // <1>
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp
  • 协议转换

在成功完成握手之后,支持HTTP升级请求的TCP套接字对客户端和服务器来说都会保持开放状态,以便它们能够继续发送和接收消息。

本文档无法全面介绍WebSocket的工作原理。请参阅RFC 6455、HTML5中的WebSocket章节,或网络上众多的相关介绍和教程。

请注意,如果WebSocket服务器运行在Web服务器(例如nginx)之后,您可能需要配置它将WebSocket升级请求转发给WebSocket服务器。同样地,如果应用程序在云环境中运行,请查阅云提供商关于WebSocket支持的说明。

HTTP 与 WebSocket

尽管WebSocket被设计为与HTTP兼容,并且是以一个HTTP请求开始的,但重要的是要理解,这两种协议导致了非常不同的架构和应用编程模型。

在HTTP和REST中,一个应用程序被建模为多个URL。为了与应用程序交互,客户端通过请求-响应的方式访问这些URL。服务器根据HTTP URL、方法和头部信息将请求路由到相应的处理程序。

相比之下,在WebSocket中,初次连接时通常只有一个URL。此后,所有应用程序消息都通过同一个TCP连接进行传输。这表明它采用了一种完全不同的异步、事件驱动的消息传递架构。

WebSocket也是一种低级别的传输协议,与HTTP不同,它不对消息的内容规定任何语义规则。这意味着,除非客户端和服务器就消息的语义达成一致,否则无法路由或处理消息。

WebSocket客户端和服务器可以通过HTTP握手请求中的Sec-WebSocket-Protocol头部来协商使用更高级别的消息协议(例如STOMP)。如果没有这个头部,它们就需要自己制定约定。

何时使用 WebSockets

WebSocket可以使网页变得动态和交互式。然而,在许多情况下,AJAX与HTTP流或长轮询的结合可以提供一种简单而有效的解决方案。

例如,新闻、邮件和社交动态需要动态更新,但每隔几分钟更新一次可能也完全没问题。另一方面,协作应用、游戏和金融类应用程序则需要更接近实时的更新效果。

仅延迟这一因素并不足以作为决策依据。如果消息量相对较低(例如,用于监控网络故障),HTTP流式传输或轮询就能够提供有效的解决方案。只有低延迟、高频率以及大消息量的结合,才能真正使得WebSocket成为最佳选择。

还要记住,在互联网上,一些不受你控制的限制性代理可能会妨碍WebSocket交互,要么是因为这些代理没有被配置为传递Upgrade头信息,要么是因为它们会关闭那些看似处于空闲状态的长时间连接。这意味着,对于防火墙内的内部应用程序来说,使用WebSocket是一个更为直接的选择,而对于面向公众的应用程序而言则不然。

部分总结