WebSocket 原理
首先,我们先来了解一下 WenSocket
WebSocket:本质上是一个基于 TCP 的协议,双向通讯协议,实现浏览器和客户端的实时通讯,接收端和发送端相互通讯,是有状态的
网络上的两个程序通过一个双向链路进行通信,这个双向链路的一端称为一个 Socket,一个 Socker 对应一个 IP 地址和端口号,应用程序通常通过 Socket 向网络发出或应答网络请求
socket 不是协议,是对 TCP/IP 协议层抽象出来的 API
WebSocket 通过 HTTP 协议进行一次握手,握手后数据就直接从 TCP 层的 Socket 传输,与 HTTP 协议无关
握手 => 指应用协议层,握手时,TCP 连接已建立
Netty 实现 WebSocket
1. 导入依赖
<dependencies>
<!-- Spring Boot WebSocket -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- Netty -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.68.Final</version>
</dependency>
</dependencies>
2. 创建 WebSocket 服务器
@Configuration
@Slf4j
public class NettyWebsocketServer {
/**
* 创建 DefaultChannelGroup,用来保存所有已经连接的 WebSocket Channel,群发和一对一功能可以用上
*/
private final static ChannelGroup channelGroup =
new DefaultChannelGroup(ImmediateEventExecutor.INSTANCE);
//bossGroup 连接线程组,主要负责接受客户端连接
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
//workerGroup 工作线程组,主要负责网络IO读写
EventLoopGroup workerGroup = new NioEventLoopGroup();
@PostConstruct
public void start() throws InterruptedException {
// init();
run();
}
/**
* 销毁
*/
@PreDestroy
public void destroy() {
Future<?> future = bossGroup.shutdownGracefully();
Future<?> future1 = workerGroup.shutdownGracefully();
future.syncUninterruptibly();
future1.syncUninterruptibly();
log.info("关闭 ws server 成功");
}
publi