第二章Netty,Netty服务端+客户端完整可运行示例,流程分析
以下是一套‌自带半包处理能力‌的Netty服务端客户端完整可运行示例完全适配之前我们讨论的TCP无边界流问题实现客户端发送任意长度字符串、服务端都能稳定接收并回显的效果一Netty服务端客户端完整可运行示例第一步先引入Maven依赖确保项目中导入稳定版Netty依赖避免使用处于Alpha阶段的5.0版本dependencygroupIdio.netty/groupIdartifactIdnetty-all/artifactIdversion4.1.100.Final/version/dependency第二步服务端完整代码服务端采用主从Reactor双线程模型提前加入换行拆帧处理器彻底解决半包问题同时配置了标准TCP参数importio.netty.bootstrap.ServerBootstrap;importio.netty.channel.ChannelFuture;importio.netty.channel.ChannelHandlerContext;importio.netty.channel.ChannelInboundHandlerAdapter;importio.netty.channel.ChannelInitializer;importio.netty.channel.nio.NioEventLoopGroup;importio.netty.channel.socket.SocketChannel;importio.netty.channel.socket.nio.NioServerSocketChannel;importio.netty.channel.ChannelOption;importio.netty.handler.codec.LineBasedFrameDecoder;importio.netty.handler.codec.string.StringDecoder;importio.netty.handler.codec.string.StringEncoder;importjava.nio.charset.StandardCharsets;publicclassNettyServer{publicstaticvoidmain(String[]args)throwsInterruptedException{// 1. 初始化双线程组boss组负责接收连接worker组负责处理连接读写NioEventLoopGroupbossGroupnewNioEventLoopGroup(1);NioEventLoopGroupworkerGroupnewNioEventLoopGroup();try{ServerBootstrapserverBootstrapnewServerBootstrap();serverBootstrap.group(bossGroup,workerGroup)// 指定NIO传输模型.channel(NioServerSocketChannel.class)// 服务端连接排队队列最大长度.option(ChannelOption.SO_BACKLOG,1024)// 开启TCP心跳机制检测死连接.childOption(ChannelOption.SO_KEEPALIVE,true)// 关闭Nagle算法保证高实时性场景下数据立即发送.childOption(ChannelOption.TCP_NODELAY,true)// 为每个新连接初始化处理器流水线.childHandler(newChannelInitializerSocketChannel(){OverrideprotectedvoidinitChannel(SocketChannelch){// 核心先加入换行拆帧器最大支持2048字节的单条消息彻底解决半包ch.pipeline().addLast(newLineBasedFrameDecoder(2048));// 加入字符串编解码器自动完成字节和字符串的转换ch.pipeline().addLast(newStringDecoder(StandardCharsets.UTF_8));ch.pipeline().addLast(newStringEncoder(StandardCharsets.UTF_8));// 自定义业务处理器ch.pipeline().addLast(newChannelInboundHandlerAdapter(){OverridepublicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){StringreceiveMsg(String)msg;System.out.println(服务端收到消息receiveMsg);// 给客户端回写响应末尾加换行符匹配拆帧规则ctx.writeAndFlush(服务端已收到receiveMsgSystem.lineSeparator());}OverridepublicvoidexceptionCaught(ChannelHandlerContextctx,Throwablecause){cause.printStackTrace();ctx.close();}});}});// 绑定8888端口同步等待绑定完成ChannelFuturebindFutureserverBootstrap.bind(8888).sync();System.out.println(Netty服务端启动成功监听端口8888);// 阻塞等待服务端通道关闭避免主线程直接退出bindFuture.channel().closeFuture().sync();}finally{// 优雅关闭所有线程组释放资源bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}}第三步客户端完整代码客户端同样配置和服务端匹配的拆帧处理器保证两端的消息边界规则完全对齐避免出现解析异常importio.netty.bootstrap.Bootstrap;importio.netty.channel.ChannelFuture;importio.netty.channel.ChannelHandlerContext;importio.netty.channel.ChannelInboundHandlerAdapter;importio.netty.channel.ChannelInitializer;importio.netty.channel.nio.NioEventLoopGroup;importio.netty.channel.socket.SocketChannel;importio.netty.channel.socket.nio.NioSocketChannel;importio.netty.handler.codec.LineBasedFrameDecoder;importio.netty.handler.codec.string.StringDecoder;importio.netty.handler.codec.string.StringEncoder;importjava.nio.charset.StandardCharsets;publicclassNettyClient{publicstaticvoidmain(String[]args)throwsInterruptedException{// 初始化客户端事件循环组处理所有连接和读写事件NioEventLoopGroupeventLoopGroupnewNioEventLoopGroup();try{BootstrapbootstrapnewBootstrap();bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class)// 设置连接超时时间为3秒.option(io.netty.channel.ChannelOption.CONNECT_TIMEOUT_MILLIS,3000).handler(newChannelInitializerSocketChannel(){OverrideprotectedvoidinitChannel(SocketChannelch){// 和服务端配置完全一致的拆帧器保证消息边界对齐ch.pipeline().addLast(newLineBasedFrameDecoder(2048));ch.pipeline().addLast(newStringDecoder(StandardCharsets.UTF_8));ch.pipeline().addLast(newStringEncoder(StandardCharsets.UTF_8));// 自定义客户端业务处理器ch.pipeline().addLast(newChannelInboundHandlerAdapter(){OverridepublicvoidchannelActive(ChannelHandlerContextctx){// 连接建立成功后向服务端发送测试消息末尾加换行符匹配拆帧规则StringtestMsghello,how are youSystem.lineSeparator();ctx.writeAndFlush(testMsg);System.out.println(客户端已发送消息);}OverridepublicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){System.out.println(客户端收到服务端响应msg);}OverridepublicvoidexceptionCaught(ChannelHandlerContextctx,Throwablecause){cause.printStackTrace();ctx.close();}});}});// 异步连接本地8888端口同步等待连接完成ChannelFutureconnectFuturebootstrap.connect(127.0.0.1,8888).sync();// 阻塞等待客户端通道关闭connectFuture.channel().closeFuture().sync();}finally{eventLoopGroup.shutdownGracefully();}}}运行说明先启动服务端控制台打印启动成功提示后再启动客户端两端通过LineBasedFrameDecoder自动处理TCP粘包半包无论消息长短都能稳定解析运行后可以看到服务端完整打印客户端发送的长字符串客户端也能正常收到服务端的回显响应完全复现之前测试短字符串时的正常效果同时支持任意长度的文本消息传输。二Netty服务端与客户端全流程分析Netty基于异步事件驱动模型实现高性能网络通信服务端和客户端的运行流程围绕核心的线程模型、IO事件处理机制展开以下从核心组件、启动流程、运行时通信全链路三个维度进行完整拆解一、核心基础组件前置说明在分析流程前先明确几个贯穿两端的核心抽象是理解整个运行逻辑的基础EventLoopGroup‌事件循环组包含多个NioEventLoop每个EventLoop绑定1个独立线程和1个Java NIO Selector循环处理IO事件和任务队列中的任务从根本上避免多线程同步开销。Channel‌Netty对网络连接的抽象封装了底层Socket的所有IO操作所有操作都是异步执行调用后立即返回ChannelFuture对象可通过监听器异步感知操作结果。ChannelPipeline‌责任链模式实现的处理器流水线每个Channel绑定独立的Pipeline入站事件从头部向尾部流转出站事件从尾部向头部流转依次经过注册的ChannelHandler完成编解码、业务处理等逻辑。二、服务端完整运行流程服务端采用经典的主从Reactor双线程模型将连接监听和数据读写完全解耦流程分为5个核心阶段资源初始化与引导配置‌创建两个独立的EventLoopGroupbossGroup默认仅1个线程专门负责监听端口、接收客户端连接workerGroup默认线程数为CPU核心数*2负责处理所有已建立连接的IO读写事件。通过ServerBootstrap启动引导器绑定双线程组、指定NIO传输模型的NioServerSocketChannel同时配置TCP底层参数比如SO_BACKLOG设置服务端可排队的最大连接数。服务端Channel初始化与注册‌通过反射创建NioServerSocketChannel实例为其初始化专属的ChannelPipeline添加服务端启动过程中需要的处理器。随后将该ServerSocketChannel注册到bossGroup中的某个EventLoop的Selector上注册完成后触发通道就绪事件。端口绑定与启动完成‌注册成功后将NioServerSocketChannel绑定到指定的本地端口完成端口监听的初始化。此时服务端正式进入运行状态boss线程开始轮询Selector的ACCEPT事件。连接接收与分发‌当客户端发起TCP三次握手后Selector触发ACCEPT事件boss线程通过NioServerSocketChannel的accept方法创建对应的NioSocketChannel代表服务端侧的客户端连接随后将这个新的SocketChannel注册到workerGroup中某一个空闲的EventLoop的Selector上彻底将连接的后续处理交给worker线程池。连接的IO事件处理‌被分配的worker线程循环轮询Selector的读写事件当连接有数据到达时触发读事件数据经过Pipeline中的解码器、业务处理器依次处理当需要向客户端返回数据时触发写事件数据经过编码器后写入底层Socket缓冲区发送出去。同时每个EventLoop还会处理自身任务队列中的异步任务支持用户自定义提交延迟任务或普通异步任务。三、客户端完整运行流程客户端采用单Reactor线程模型所有连接、读写逻辑都由同一个EventLoopGroup处理流程分为3个核心阶段资源初始化与引导配置‌创建客户端专属的NioEventLoopGroup通过Bootstrap启动引导器绑定该线程组指定客户端NIO通道NioSocketChannel同时配置TCP参数比如设置连接超时时间避免长时间阻塞。通道初始化与连接建立‌通过ChannelInitializer为即将创建的SocketChannel初始化Pipeline按顺序添加编解码器、业务处理器遵循“解码器在前、业务处理器在中、编码器在后”的配置原则。调用connect(host, port)方法异步发起TCP连接返回ChannelFuture对象可通过添加监听器感知连接成功或失败的状态连接失败时可通过调度线程实现指数退避重连机制。通信与资源释放‌连接建立完成后客户端的EventLoop线程开始轮询该通道的读写事件完成和服务端的双向数据交互。当通道关闭事件触发时自动释放底层Socket资源最终优雅关闭EventLoopGroup终止所有事件循环线程。四、两端通信全链路关键细节所有IO操作全程异步没有任何阻塞等待逻辑通过ChannelListener回调机制感知操作结果大幅提升高并发场景下的吞吐量。一个EventLoop在整个生命周期内只会绑定唯一的一个线程该EventLoop下所有注册的Channel的IO事件都由这个专属线程处理天然避免了多线程并发安全问题不需要额外加锁。结合之前提到的帧拆分处理器如LengthFieldBasedFrameDecoder可以在Pipeline的最前置环节自动完成半包数据的拼接解析保证后续业务处理器拿到的永远是完整的业务消息从应用层彻底解决TCP无边界流带来的半包问题。

相关新闻

AI 多轮对话状态机:不是所有聊天都需要无限轮次

AI 多轮对话状态机:不是所有聊天都需要无限轮次

AI 多轮对话状态机:不是所有聊天都需要无限轮次 一、多轮对话的产品陷阱是越聊越散 AI 陪伴类产品常把"支持无限轮次对话"当作卖点。但在实际使用中,超过5轮的对话往往会发散。用户的话题从一个方向漂到另一个方向,模型为了保持连贯…

2026/7/7 11:25:04 阅读更多 →
工业信号干扰解决方案与FOD4216光耦应用

工业信号干扰解决方案与FOD4216光耦应用

1. 工业环境中的信号干扰挑战在电机控制、PLC系统等工业场景中,电磁干扰(EMI)就像一场永不间断的暴雨。我曾在某自动化产线项目中,遇到过编码器信号被变频器干扰导致定位偏移5mm的案例——这足以让精密装配线彻底瘫痪。工业现场的…

2026/7/7 11:23:04 阅读更多 →
网易云音乐永久直链解析:告别链接失效的终极解决方案

网易云音乐永久直链解析:告别链接失效的终极解决方案

网易云音乐永久直链解析:告别链接失效的终极解决方案 【免费下载链接】netease-cloud-music-api 网易云音乐直链解析 API 项目地址: https://gitcode.com/gh_mirrors/ne/netease-cloud-music-api 还在为收藏的网易云音乐链接突然失效而烦恼吗?网易…

2026/7/7 11:21:03 阅读更多 →

最新新闻

收藏!互联网产品经理转AI的8大行业方向深度解析,小白也能看懂

收藏!互联网产品经理转AI的8大行业方向深度解析,小白也能看懂

本文深入剖析了互联网产品经理转向AI领域的八个主要行业方向,包括AI电商、AI原生应用、AI金融、AI硬件、AI机器人、AI教育、AI医疗和AI制造。文章详细分析了每个方向的特点、岗位机会、工作内容、适合人群以及薪资情况,并提供了转行建议,旨在…

2026/7/7 12:23:31 阅读更多 →
2026最新6款免费AI编程工具全生命周期实测学生党平替权威合集

2026最新6款免费AI编程工具全生命周期实测学生党平替权威合集

一、开篇引言很多人选 AI 编程工具只看一个指标:补全速度快不快。但真正影响开发效率的是全流程的支持能力。我按项目生命周期的每个阶段逐个对比。我是一名外企远程办公全栈开发者,常年在外企云平台维护车联网数据采集平台V4.1,日常大量编写…

2026/7/7 12:21:30 阅读更多 →
终极指南:3分钟掌握Switch破解神器TegraRcmGUI

终极指南:3分钟掌握Switch破解神器TegraRcmGUI

终极指南:3分钟掌握Switch破解神器TegraRcmGUI 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI 你是否曾经看着手中的Switch,想象过它…

2026/7/7 12:17:29 阅读更多 →
数据产业服务分类(36)——原则、目标与方法——分类设计目标

数据产业服务分类(36)——原则、目标与方法——分类设计目标

数据产业分类设计的目的是明确界定数据产业服务的范围和内容,有效识别和区分各种服务内容,为数据产业服务的获取与提供、政策制定及行业发展提供坚实基础、提供支撑。构建数据产业服务分类的核心目标是为数据产业服务的标准体系建立奠定基础。达到覆盖数据全生命周期…

2026/7/7 12:15:29 阅读更多 →
小白程序员必看:大模型系统开发10层深度解析,从基础到实战

小白程序员必看:大模型系统开发10层深度解析,从基础到实战

本文深入剖析了大模型系统开发的十个关键层次,涵盖模型语言理解、模型表现优化、提示工程、知识库问答、Agent技能、推理成本控制、系统评估与安全、上线后运维等核心领域。文章以实际案例为引,详细解读了每个层次中的63个核心概念,旨在帮助读…

2026/7/7 12:13:28 阅读更多 →
鱼叉式钓鱼攻击:从社会工程学到多层防御的实战解析

鱼叉式钓鱼攻击:从社会工程学到多层防御的实战解析

1. 项目概述:从“广撒网”到“精准狙击”的威胁演进在网络安全领域,钓鱼攻击早已不是什么新鲜事。但如果你还停留在“恭喜您中奖了,请点击链接领取”这种群发邮件的印象里,那可能已经落后于攻击者的步伐了。今天要深入探讨的“鱼叉…

2026/7/7 12:11:28 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻