前言
在springboot整合websocket之前,先简单阐述下websocket的基本概念,以及与它相关的sockjs,stomp又是什么。
WebSocket简介
WebSocket协议是 HTML5新增的一种在单个TCP连接上进行全双工通讯的协议,在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成一条快速通道,两者之间就直接可以数据相互传送了。
WebSocket与HTTP的不同之处在于:
WebSocket是一种全双工通信协议,在建立连接后,WebSocket服务器和浏览器端都能够主动的向对方发送消息,就像Socket一样。而HTTP只能由客户端发起请求,服务器返回查询结果,做不到服务器主动向客户端发送请求,如下图所示
WebSocket的特点
这里总结下WebSocket的特点:
- WebSocket服务器和浏览器都能够主动向对方发送消息
- 建立在 TCP协议之上,服务器的实现比较容易
- 与HTTP 协议有着良好的兼容性,默认端口也是 80和443,并且握手阶段采用HTTP协议,可以通过HTTP代理
- 数据格式比较轻量,性能开销小,通信高效
- 可以发送文本,也可以发送二进制数据
- 没有同源限制,客户端可以与任意服务器通信
- 协议标识符是 ws
(如果加密,则为wss
),服务器网址是URL
SockJS
SockJS是一个浏览器上运行的JavaScript库,如果浏览器不支持 WebSocket,该库可以模拟对 WebSocket的支持,实现浏览器和Web服务器之间的低延迟,全双工,跨域的通讯通道
STOMP
STOMP即 Simple(or Streaming) Text Oriented Messaging Protocol 的简称,简单(流)文本定向消息协议,它提供了一个可户操作的连接格式,允许 STOMP 客户端与任意 STOMP消息代理(Broker)进行交互,STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛应用
之前的介绍谈到 WebSocket是基于 TCP协议的,直接使用WebSocket(或者SockJS)来编程就与直接使用TCP套接字来编程web应用类似,这会非常难受,因为没有高层协议,因此就需要我们定义应用间所发送消息的语义,还需要确保连接两端都能遵循这些语义。
那么现在STOMP就派上用场了,同HTTP在TCP套接字上添加请求-响应模型层一样,STOMP在 WebSocket之上提供了一个基于帧的线路格式层,用来定义消息语义。
STOMP帧
STOMP帧由命令,一个或多个头消息以及负载所组成,如下所示是一个发送数据的STOMP帧:
SEND
destination:/app/room-message
content-length:20
{\"message\":\"Hello!\"}
对上面分析如下:
- SEND: STOMP命令,表明会发送一些内容
- destination: 头消息,用来表示消息发送到哪里
- content-length: 头信息,用来表示负载内容的大小
- 空行
- 帧内容(负载)内容
WebSocket、SockJS、STOMP的关系
简单说就是,WebSocket是基于TCP的底层协议,SockJS是WebSocket的备选方案,用于那些不支持WebSocket的浏览器,也是底层协议,而STOMP是 WebSocket的上层协议,是高级协议
SpringBoot整合WebSocket
前面铺垫了一些基础知识过后,下面进入本篇文章的主题,使用SpringBoot+WebSocket+SockJS+STOMP搭建一个广播式的WebSocket
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
WebSocket配置