WebSocket 是一种全双工通信协议,可以在客户端和服务器之间建立持久连接,广泛应用于即时聊天、实时数据推送等场景。Netty 提供了对 WebSocket 协议的全面支持,可以快速实现一个高效的 WebSocket 服务。
本文将从基础原理出发,逐步讲解如何使用 Netty 实现 WebSocket 通信。
1. WebSocket 基本原理
1.1 什么是 WebSocket?
- WebSocket 是一个基于 TCP 的全双工协议,通过一次 HTTP 请求升级为 WebSocket 协议后,客户端和服务器可以在单个连接上自由发送消息。
- WebSocket 的默认端口:
- 80(非加密通信)
- 443(加密通信)
1.2 WebSocket 工作流程
- 连接建立:通过 HTTP 请求,使用
Upgrade: websocket
升级协议。 - 数据传输:升级后使用帧(Frame)进行数据传输,帧可以是文本、二进制或控制信息。
- 连接关闭:客户端或服务器可随时关闭连接。
2. Netty 对 WebSocket 的支持
Netty 提供了以下 WebSocket 处理器:
WebSocketServerProtocolHandler
:处理 WebSocket 协议升级和帧的管理。TextWebSocketFrame
:表示 WebSocket 文本帧。BinaryWebSocketFrame
:表示 WebSocket 二进制帧。PingWebSocketFrame
和PongWebSocketFrame
:用于心跳检测。
3. 使用 Netty 实现 WebSocket 服务
以下是完整的实现过程,包括服务端和客户端代码。
3.1 服务端代码
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
public class WebSocketServer {
public static void main(String[] args) throws InterruptedException {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap