news 2026/7/3 20:33:52

第二章Netty,入门版HelloWorld

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第二章Netty,入门版HelloWorld

一、 服务端代码 HelloWorldServer.java

importio.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{EventLoopGroupboss=newNioEventLoopGroup(1);EventLoopGroupworker=newNioEventLoopGroup();try{newServerBootstrap().group(boss,worker).channel(NioServerSocketChannel.class).childHandler(newChannelInitializer<SocketChannel>(){@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.java

importio.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{EventLoopGroupgroup=newNioEventLoopGroup();try{newBootstrap().group(group).channel(NioSocketChannel.class).handler(newChannelInitializer<SocketChannel>(){@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 的手动转换过程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 20:26:17

Meta Compute:AI算力军备竞赛从“囤卡“到“卖卡“的范式转折

摘要:2026年7月1日,彭博社独家披露Meta正在推进代号"Meta Compute"的云基础设施业务,计划向外部客户开放AI算力租赁与自研模型API服务。消息发布后Meta股价单日大涨8.8%,但全球半导体板块暴跌超6%,算力租赁商CoreWeave单日重挫13.92%。这不是简单的"算力过…

作者头像 李华
网站建设 2026/7/3 20:15:12

ModEngine2终极指南:魂系游戏模组开发的完整解决方案

ModEngine2终极指南&#xff1a;魂系游戏模组开发的完整解决方案 【免费下载链接】ModEngine2 Runtime injection library for modding Souls games. WIP 项目地址: https://gitcode.com/gh_mirrors/mo/ModEngine2 ModEngine2是一个专为魂系游戏设计的运行时注入库&…

作者头像 李华
网站建设 2026/7/3 20:11:30

STM32与Si4731构建低功耗音乐播放系统

1. 项目背景与硬件选型解析这个项目本质上是一个基于STM32微控制器和Si4731收音机芯片的DIY音乐播放系统。作为一名电子工程师&#xff0c;我最近在整理工作室时翻出了几片闲置的STM32L442KC开发板&#xff0c;正好手头也有Si4731收音机模块&#xff0c;于是决定把它们组合起来…

作者头像 李华
网站建设 2026/7/3 20:10:36

Windows APK安装终极指南:免模拟器跨平台应用体验

Windows APK安装终极指南&#xff1a;免模拟器跨平台应用体验 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想过在Windows电脑上直接运行手机应用&#xf…

作者头像 李华