第二章Netty,入门版HelloWorld 一、 服务端代码 HelloWorldServer.javaimportio.netty.bootstrap.ServerBootstrap;importio.netty.buffer.Unpooled;importio.netty.channel.*;importio.netty.channel.nio.NioEventLoopGroup;importio.netty.channel.socket.SocketChannel;importio.netty.channel.socket.nio.NioServerSocketChannel;importio.netty.util.CharsetUtil;publicclassHelloWorldServer{publicstaticvoidmain(String[]args)throwsException{EventLoopGroupbossnewNioEventLoopGroup(1);EventLoopGroupworkernewNioEventLoopGroup();try{newServerBootstrap().group(boss,worker).channel(NioServerSocketChannel.class).childHandler(newChannelInitializerSocketChannel(){OverrideprotectedvoidinitChannel(SocketChannelch){ch.pipeline().addLast(newChannelInboundHandlerAdapter(){OverridepublicvoidchannelActive(ChannelHandlerContextctx){System.out.println(Client connected: ctx.channel().remoteAddress());// 发送 Hello World 并自动关闭连接ctx.writeAndFlush(Unpooled.copiedBuffer(Hello World!,CharsetUtil.UTF_8)).addListener(ChannelFutureListener.CLOSE);}});}}).bind(8080).sync().channel().closeFuture().sync();}finally{boss.shutdownGracefully();worker.shutdownGracefully();}}}二、 客户端代码 HelloWorldClient.javaimportio.netty.bootstrap.Bootstrap;importio.netty.buffer.ByteBuf;importio.netty.channel.*;importio.netty.channel.nio.NioEventLoopGroup;importio.netty.channel.socket.SocketChannel;importio.netty.channel.socket.nio.NioSocketChannel;importio.netty.util.CharsetUtil;publicclassHelloWorldClient{publicstaticvoidmain(String[]args)throwsException{EventLoopGroupgroupnewNioEventLoopGroup();try{newBootstrap().group(group).channel(NioSocketChannel.class).handler(newChannelInitializerSocketChannel(){OverrideprotectedvoidinitChannel(SocketChannelch){ch.pipeline().addLast(newChannelInboundHandlerAdapter(){OverridepublicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){ByteBufin(ByteBuf)msg;System.out.println(Client received: in.toString(CharsetUtil.UTF_8));ctx.close();}OverridepublicvoidexceptionCaught(ChannelHandlerContextctx,Throwablecause){cause.printStackTrace();ctx.close();}});}}).connect(localhost,8080).sync().channel().closeFuture().sync();}finally{group.shutdownGracefully();}}}三、 运行结果先运行 HelloWorldServer。再运行 HelloWorldClient。‌客户端输出‌Client received: Hello World!‌服务端输出‌Client connected: /127.0.0.1:xxxxx四HelloWorld的详细解释一、 核心组件解析1. EventLoopGroup事件循环组‌作用‌Netty 的线程池负责处理所有的 I/O 操作和事件。‌服务端双组模型‌bossGroup仅负责‌接收‌新的客户端连接请求Accept。通常设为 1 个线程。workerGroup负责已建立连接的‌读写‌操作Read/Write。默认线程数为 CPU 核数 * 2。‌客户端单组模型‌只需一个 group既负责连接也负责读写。2. Channel通道‌NioServerSocketChannel‌服务端的 ServerSocket 封装用于监听端口。‌NioSocketChannel‌客户端或服务端接受连接后的 Socket 封装代表一条具体的 TCP 连接。‌特性‌Netty 的 Channel 是异步非阻塞的所有 I/O 操作都返回 ChannelFuture允许注册回调监听完成状态。3. ChannelInitializer通道初始化器‌作用‌当新连接建立时Netty 会自动调用其 initChannel 方法。‌目的‌为新创建的 Channel 配置 Pipeline处理器链添加必要的 Handler如编解码器、业务逻辑处理器。4. ChannelPipeline ChannelHandler管道与处理器‌Pipeline‌每个 Channel 都有一个唯一的 Pipeline它是一个责任链结构。‌Handler‌链上的节点。ChannelInboundHandlerAdapter入站处理器处理读取数据、连接激活等事件。channelActive连接建立成功时触发常用于发送欢迎语。channelRead接收到数据时触发。exceptionCaught发生异常时触发。二、 执行流程详解1. 服务端启动流程‌创建引导类‌ServerBootstrap 实例化。‌配置线程组‌绑定 boss 和 worker 组。‌指定通道类型‌设置为 NioServerSocketChannel。‌配置子处理器‌通过 childHandler 定义新连接的处理逻辑添加 HelloWorldHandler。‌绑定端口‌bind(8080) 启动监听sync() 阻塞直到绑定成功。‌等待关闭‌closeFuture().sync() 阻塞主线程防止程序退出直到服务端主动关闭。2. 客户端连接与服务端响应流程‌客户端发起连接‌Bootstrap.connect(“localhost”, 8080) 发起异步连接。‌服务端接收连接‌bossGroup 线程检测到新连接创建 NioSocketChannel。将该 Channel 注册到 workerGroup 的某个 EventLoop 上。触发 ChannelInitializer.initChannel将自定义 Handler 加入 Pipeline。触发 channelActive 事件。‌服务端发送消息‌在 channelActive 中调用 ctx.writeAndFlush(“Hello World!”)。数据经过 Pipeline 出站Outbound最终通过 Socket 发送给客户端。ChannelFutureListener.CLOSE 确保发送完成后立即关闭连接。‌客户端接收消息‌客户端 worker 线程检测到数据到达触发 channelRead。解析 ByteBuf 并打印内容。调用 ctx.close() 关闭客户端连接。三、 关键设计原理1. Reactor 线程模型Netty 采用主从 Reactor 多线程模型‌Main Reactor (Boss)‌单线程处理连接接入避免竞争锁提高接入效率。‌Sub Reactor (Worker)‌多线程处理业务 I/O充分利用多核 CPU 并行处理能力。2. 零拷贝与 ByteBuf‌ByteBuf‌Netty 自定义的数据容器相比 JDK ByteBuffer它支持自动扩容、堆内/堆外内存混合使用、引用计数管理避免了频繁的内存分配与回收。‌零拷贝‌在 writeAndFlush 过程中Netty 尽可能减少数据在内核态与用户态之间的拷贝次数如使用 DirectBuffer。3. 异步非阻塞 I/O所有 I/O 操作connect, read, write都是异步的立即返回 ChannelFuture。开发者可通过 sync() 同步等待结果或通过 addListener() 注册回调异步处理极大提升了并发吞吐量。四、 总结Netty HelloWorld 虽简单但完整展示了 ‌Reactor 模型、Pipeline 责任链、异步事件驱动‌ 三大核心机制。它是理解 Netty 高并发能力的基石后续复杂的协议编解码、心跳检测、流量控制均在此基础上扩展。需要我为你演示如何在 HelloWorld 基础上添加 ‌StringEncoder/StringDecoder‌ 实现字符串直接传输吗帮你简化 ByteBuf 的手动转换过程。