介绍
WebSocket 是基于 TCP 的一种新的**网络协议**。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建**持久性**的连接, 并进行**双向**数据传输。
技术原理
- WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
- WebSocket通过HTTP/1.1协议的101状态码进行握手,完成握手后,客户端和服务器之间就直接可以创建持久性的连接,并进行双向数据传输。
- WebSocket具有较少的控制开销,在不包含扩展的情况下,数据包头部大小相对较小,显著减少了数据传输的开销。
- WebSocket支持更好的二进制支持,定义了二进制帧,可以更轻松地处理二进制内容。
HTTP协议和WebSocket协议对比
- HTTP是**短连接**
- WebSocket是**长连接**
- HTTP通信是**单向**的,基于请求响应模式
- WebSocket支持**双向**通信
- HTTP和WebSocket底层都是TCP连接
优势:
- 实时性:由于WebSocket是全双工的,服务器可以随时主动给客户端下发数据,无需等待客户端发起请求,因此具有更强的实时性。
- 节省资源:WebSocket通过减少HTTP请求的频率和开销,显著节省了服务器资源和带宽。
- 保持连接状态:与HTTP不同的是,WebSocket需要先创建连接,之后通信时可以省略部分状态信息,从而提高了通信效率。
- 跨域支持:WebSocket协议可以跨域使用,允许不同源的客户端与服务器进行通信。
思考:
既然WebSocket支持双向通信,功能看似比HTTP强大,那么我们是不是可以基于WebSocket开发所有的业务功能?
WebSocket缺点:
服务器长期维护长连接需要一定的成本
各个浏览器支持程度不一
WebSocket 是长连接,受网络限制比较大,需要处理好重连
结论:**WebSocket并不能完全取代HTTP,它只适合在特定的场景下使用
实现步骤
1). 直接使用websocket.html页面作为WebSocket客户端
2). 导入WebSocket的maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
3). 导入WebSocket服务端组件WebSocketServer,用于和客户端通信
4). 导入配置类WebSocketConfiguration,注册WebSocket的服务端组件
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* WebSocket配置类,用于注册WebSocket的Bean
*/
@Configuration
public class WebSocketConfiguration {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}