一、什么是WebSocket
WebSocket是一种在单个TCP连接上进行全双工通信的协议。它最初于2008年被提出,后来由IETF标准化。WebSocket协议旨在解决HTTP协议的一些限制,例如HTTP请求只能由客户端发起,服务器不能主动向客户端发送数据等。
1.产生背景
早期,很多网站为了实现推送技术,所用的技术都是轮询。轮询是指由浏览器每隔一段时间向服务器发出HTTP请求,然后服务器返回最新的数据给客户端。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求与回复可能会包含较长的头部,其中真正有效的数据可能只是很小的一部分,所以这样会消耗很多带宽资源。
在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
2.WebSocket与HTTP轮询的异同
如上图所示,从上图看出可以,WebSocket和HTTP轮询本质上都依赖于TCP的握手,他们二者都是应用层的协议,事实上,WebSocket和HTTP的工作端口都是80和443,WebSocket可以使用HTTP代理和中介,兼容HTTP协议。
不同的是HTTP轮询获取信息每次都需要客户端向服务端发送请求建立连接,而WebScoket经过第一次建立连接后,连接就被持久化下来, 不需要重复建立连接,而且可以由服务端主动向客户端发送信息。
二、WebScoket的优缺点
WebSocket的优点包括:
- 1. 实时性:WebSocket可以实现实时通信,服务器可以主动向客户端推送数据,而不需要客户端发起请求。
- 2. 减少网络流量:WebSocket使用单个TCP连接,减少了网络流量和延迟。
- 3. 更少的延迟:WebSocket使用二进制协议,减少了数据传输的开销,从而减少了延迟。
- 4. 更好的跨域支持:WebSocket协议支持跨域通信,可以在不同的域名之间进行通信
WebSocket的缺点包括:
- 1. 兼容性问题:WebSocket协议在一些旧的浏览器中不被支持,需要使用polyfill或者其他技术来解决兼容性问题。
- 2. 安全问题:WebSocket协议需要使用SSL/TLS协议来保证通信的安全性,否则可能会被中间人攻击。
- 3. 服务器资源占用:WebSocket协议需要服务器一直保持连接,会占用一定的服务器资源。
三、Spring boot集成WebSocket
下面用一个简单的示例,展示Spring boot如何集成WebSocket,然后实现简单的建立连接后服务器向客户端发送信息并向其他在线用户广播。
步骤1.导入WebSocket依赖
新建Spring boot项目,在pom文件加入以下代码
<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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
步骤2.编写拦截器、处理器、配置类
创建如下文件夹:
在interceptor文件家新建WebSocketInterceptor类文件,代码如下:
@Component
public class WebSocketInterceptor extends HttpSessionHandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHa