在这个案例中,我们将实现WebSocket的处理器和初始化配置。
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.websocketx.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
 
@Component
public class WebSocketHandler extends SimpleChannelInboundHandler<WebSocketFrame> {
 
    private static final Map<String, ChannelHandlerContext> clients = new ConcurrentHashMap<>();
 
    @Autowired
    private TextWebSocketHandler textWebSocketHandler;
 
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {
        // 判断是否WebSocket握手请求
        if (frame instanceof FullHttpRequest) {
            handleHttpRequest(ctx, (FullHttpRequest) frame);
        } else if (frame instanceof CloseWebSocketFrame) {
            // 关闭WebSocket连接
            handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame.retain());
        } else if (frame instanceof PingWebSocketFrame) {
            // 发送Pong消息
            ctx.channel().write(new PongWebSocketFrame(frame.content().retain()));
        } else if (frame instanceof TextWebSocketFrame) {
            // 处理文本消息
            String message = ((TextWebSocketFrame) frame).text();
            textWebSocketHandler.handleTextMessage(ctx, message);
        } else {
            throw new UnsupportedOperationException("Unsupported frame type: " + frame.getClass().getName());
        }
    }
 
    private void handleHttpRequest(ChannelHandlerContext ctx, FullHttpRequest req) {
        // 如果HTTP请求不是WebSocket握手请求,则返回HTTP响应
        if (!handshaker.isWebSocketUpgradeRequest(req)) {
            sendHttpResponse(ctx, req, new DefaultFullHttpResponse(req.protocolVersion(), HttpResponseStatus.BAD_REQUEST));
            return;
        }
 
        // 构造握手响应返回
        handshaker.handshake(ctx.channel(), req);
    }
 
    private void sendHttpResponse(ChannelHandlerContext ctx, FullHttpRequest req, DefaultFullHttpResponse res) {
        // 发送HTTP响应
        if (res.status().code() != 200) {
            ByteBuf byteBuf = Unpooled.copiedBuff