websocket简介
简单介绍下webSocket,webSoket是一种基于Tcp连接的协议,只需建立一次握手,就能实现持久性的连接,允许服务器主动向浏览器推送数据,也允许浏览器向服务器推送数据。
WebSocket连接过程
客户端通过HTTP协议向服务端发送握手,服务端向客户端返回ACK,此时握手成功,建立连接并维持该连接;后面服务端和客户端就可以基于建立的连接进行双向通信,直到连接关闭。
应用场景
聊天弹幕,媒体聊天qq微信,协同编辑腾讯文档,股票基金报价实时更新,管理系统数据实时更新等
优点:
较少的控制开销。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。
更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。
保持连接状态。与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
前后端代码实现
后台使用的是springboot,前端使用的是vue,但是原理都是类似的,以下内容
亲测可用,如果不可用,请检查你的拦截器,查看你的安全框架是否对websocket连接进行拦截。
1.pom依赖文件 (注意尽量和springboot版本保持一致(这里我的版本是2.6.3))
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>${spring-boot.version}</version>
</dependency>
- 后端代码
2.1 websocket连接通信代码
@Component
@Slf4j
@ServerEndpoint("/websocket") //暴露的ws应用的路径
public class WebSocket {
// 用来存储服务连接对象
private static Map<String ,Session> clientMap = new ConcurrentHashMap<>();
// 客户端与服务端连接成功
@OnOpen
public void onOpen(Session session)