当前位置 : 首页 » 文章分类 :  开发  »  WebSocket

WebSocket

WebSocket 笔记


Server-Send Events

SSE 可实现服务器主动向客户端推送数据。与传统的轮询和长轮询相比,SSE提供了更高效和实时的数据推送机制。
SSE 基于 HTTP 协议,允许服务器将数据以事件流(Event Stream)的形式发送给客户端。客户端通过建立持久的HTTP连接,并监听事件流,可以实时接收服务器推送的数据。

和 WebSocket 对比:

  • WebSocket 是全双工双向通信,允许服务器和客户端之间进行实时的双向数据交换。SSE 是单向通信,只能服务器向客户端单向推送数据。
  • SSE使用基于HTTP的长连接,通过普通的HTTP请求和响应来建立连接。WebSocket使用自定义的协议,通过建立WebSocket连接来实现双向通信。

WebSocket 简介

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,已被 W3C 定为标准。使用 WebSocket 可以使得客户端和服务器之间的数据交换变得更加简单。
在 WebSocket 协议中,浏览器和服务器只需要完成一次握手,两者之间就可以直接创建持久性的连接,并进行双向数据传输。

WebSocket 特点:
WebSocket 使用时需要先创建连接,这使得 Websocket 成为一种有状态的协议,在之后的通信过程中可以省略部分状态信息(例如身份认证等)。
WebSocket 连接在端口 80(ws)或者 443(wss)上创建,与 HTTP 使用的端口相同,这样,基本上所有的防火墙都不会阻止 WebSocket 连接。
WebSocket 使用 HTTP 协议进行握手,因此它可以自然而然地集成到网络浏览器和 HTTP 服务器中,而不需要额外的成本。
心跳消息(ping 和 pong)将被反复的发送,进而保持 WebSocket 连接一直处于活跃状态。
使用该协议,当消息启动或者到达的时候,服务端和客户端都可以知道。
WebSocket 连接关闭时将发送一个特殊的关闭消息。
WebSocket 支持跨域,可以避免 Ajax 的限制。
HTTP 规范要求浏览器将并发连接数限制为每个主机名两个连接,但是当我们使用 Websocket 的时候,当握手完成之后,该限制就不存在了,因为此时的连接已经不再是 HTTP 连接了。
WebSocket 协议支持扩展,用户可以扩展协议,实现部分自定义的子协议。
WebSocket 拥有更好的二进制支持以及更好的压缩效果。


STOMP

STOMP(Simple Text-Orientated Messaging Protocol)是一种简单的面向文本的消息传递协议。它提供了一个可互操作的连接格式,允许 STOMP 客户端与任意 STOMP 消息代理(Broker)进行交互。STOMP 协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。


SpringBoot 中使用 WebSocket

1、利用 ServerEndpointExporter@ServerEndpoint 实现,是最简单快捷的方式。
ServerEndpointExporter 会扫描所有注解了 @ServerEndpoint 的类,将其注册为 Websocket Endpoint

SpringBoot2.0整合WebSocket,实现后端数据实时推送!
https://juejin.cn/post/6844904004762222606

SpringBoot 集成 WebSocket,实现后台向前端推送信息
https://cloud.tencent.com/developer/article/1830998

SpringBoot 实现 Websocket 通信详解
http://www.mydlq.club/article/86/


WebSocket 和 HTTP 的关系

1、 WebSocket 和 HTTP 都是基于 TCP 协议的两个不同的协议
2、 WebSocket 依赖于 HTTP 连接

从 HTTP 升级到 WebSocket

WebSocket 依赖于 HTTP 连接,那么它如何从连接的 HTTP 协议转化为 WebSocket 协议?
每个 WebSocket 连接都始于一个 HTTP 请求。
具体来说,WebSocket 协议在第一次握手连接时,通过 HTTP 协议在传送 WebSocket 支持的版本号,协议的字版本号,原始地址,主机地址等等一些列字段给服务器端:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Version: 13

注意,关键的地方是,这里面有个 Upgrade 首部,用来把当前的 HTTP 请求升级到 WebSocket 协议,这是 HTTP 协议本身的内容,是为了扩展支持其他的通讯协议。
如果服务器支持新的协议,则必须返回101:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

至此,HTTP 请求物尽其用,如果成功触发 onopen 事件,否则触发 onerror 事件,后面的传输则不再依赖 HTTP 协议。

WebSocket 为什么要依赖于 HTTP 协议的连接?
第一,WebSocket 设计上就是天生为 HTTP 增强通信(全双工通信等),所以在 HTTP 协议连接的基础上是很自然的一件事,并因此而能获得 HTTP 的诸多便利。
第二,这诸多便利中有一条很重要,基于 HTTP 连接将获得最大的一个兼容支持,比如即使服务器不支持 WebSocket 也能建立 HTTP 通信,只不过返回的是 onerror 而已,这显然比服务器无响应要好的多。

理清WebSocket和HTTP的关系
https://jayfeng.com/2016/07/25/%E7%90%86%E6%B8%85WebSocket%E5%92%8CHTTP%E7%9A%84%E5%85%B3%E7%B3%BB/


上一篇 Spring-Cloud-Netflix-Eureka

下一篇 北京中医药大学第三医院看颈椎记录

阅读
评论
1.3k
阅读预计4分钟
创建日期 2019-12-05
修改日期 2023-09-17
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论