当前位置: 首页 > news >正文

Netty入门(hello world)

1、Netty简介

Netty是由JBOSS提供的一个java开源网络通讯框架。Netty是基于Java NIO client-server的网络应用框架,使用Netty可以快速开发网络应用,例如服务器和客户端协议。Netty提供了一种新的方式来开发网络应用程序,这种新的方式使它很容易使用和具有很强的扩展性。Netty的内部实现是很复杂的,但是Netty提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty是完全基于NIO实现的,所以整个Netty都是异步的。

netty的优点

它的健壮性、功能、性能、可定制性和可扩展性在同类框架都是首屈一指的。它已经得到成百上千的商业/商用项目验证,如Hadoop的RPC框架Avro、RocketMQ以及主流的分布式通信框架Dubbox等等。

2、Hello World 入门

2.1、Netty通信的步骤:

①创建两个NIO线程组,一个专门用于网络事件处理(接受客户端的连接),另一个则进行网络通信的读写。

②创建一个ServerBootstrap对象,配置Netty的一系列参数,例如接受传出数据的缓存大小等。

③创建一个用于实际处理数据的类ChannelInitializer,进行初始化的准备工作,比如设置接受传出数据的字符集、格式以及实际处理数据的接口。

④绑定端口,执行同步阻塞方法等待服务器端启动即可。

2.2、导入netty依赖,注意版本

<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.132.Final</version> </dependency>

2.3、 代码实现

2.3.1、 服务器端
package com.xyq.netty.hello; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; public class Server { public static void main(String[] args) { EventLoopGroup bossLoopGroup = new NioEventLoopGroup(); EventLoopGroup workerLoopGroup = new NioEventLoopGroup(); // 服务端的启动对象 ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossLoopGroup, workerLoopGroup) .channel(NioServerSocketChannel.class) // 声明通道类型 .option(ChannelOption.SO_BACKLOG, 1024)//设置tcp缓冲区 .option(ChannelOption.SO_RCVBUF, 32 * 1024)//设置接收缓冲大小 .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { // 通道(socketChannel)代表的是 连接的角色 管道(pipeline)代表的是 处理业务的逻辑管理 // 管道相当与一个链表, 将不同的处理器连接起来,管理的是处理器的顺序 socketChannel.pipeline().addLast(new NettyServerHandler()); } }); try { ChannelFuture channelFuture = serverBootstrap.bind(8765).sync(); System.out.println("server start ..."); // 此处会阻塞,确保服务端一直是运行状态 channelFuture.channel().closeFuture().sync(); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { // 优雅关闭 bossLoopGroup.shutdownGracefully(); workerLoopGroup.shutdownGracefully(); } } }
2.3.2、服务器管理类
package com.xyq.netty.hello; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerAdapter; import io.netty.channel.ChannelHandlerContext; public class NettyServerHandler extends ChannelInboundHandlerAdapter { /** * 通道可读时触发 * * @param ctx 上下文 * @param msg 消息 * @throws Exception */ @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf buf = (ByteBuf) msg; byte[] bytes = new byte[buf.readableBytes()]; buf.readBytes(bytes); String msgStr = new String(bytes, CharsetUtil.UTF_8); System.out.println("客户端消息: " + msgStr); } /** * 频道已读完毕 * * @param ctx 上下文 * @throws Exception */ @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.writeAndFlush(Unpooled.copiedBuffer("hello client ", CharsetUtil.UTF_8)); } /** * 发现异常 * * @param ctx 上下文 * @param cause * @throws Exception */ @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { ctx.close(); }
2.3.3、 客户端
package com.xyq.netty.hello; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; public class Client { public static void main(String[] args) { // 客户端事件循环组 只需要一个 EventLoopGroup group = new NioEventLoopGroup(); // 客户端启动器 Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group) .channel(NioSocketChannel.class) .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast(new NettyClientHandler()); } }); try { ChannelFuture channelFuture = bootstrap.connect("localhost", 8765).sync(); System.out.println("Client connect...."); channelFuture.channel().closeFuture().sync(); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { group.shutdownGracefully(); } } }
2.3.4、客户端管理类
package com.xyq.netty.hello; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerAdapter; import io.netty.channel.ChannelHandlerContext; import io.netty.util.ReferenceCountUtil; public class NettyClientHandler extends ChannelInboundHandlerAdapter { /** * 通道被启用 刚刚建立连接 的时候触发 * * @param ctx CTX * @throws Exception 例外情况 */ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { ctx.writeAndFlush(Unpooled.copiedBuffer("你好服务端,我是客户端", CharsetUtil.UTF_8)); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf buf = (ByteBuf) msg; System.out.println("buf.readableBytes() = " + buf.readableBytes()); byte[] bytes = new byte[buf.readableBytes()]; buf.readBytes(bytes); String msgStr = new String(bytes, CharsetUtil.UTF_8); System.out.println("服务端消息 = " + msgStr); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { super.channelReadComplete(ctx); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { ctx.close(); } }
http://www.jsqmd.com/news/888352/

相关文章:

  • HyperMesh防崩溃神器:手把手教你配置自带的autosave.tcl脚本(附开机自启动教程)
  • STM32的‘心跳’与‘重启’:深入聊聊晶振与复位电路的设计门道(附PCB布局避坑指南)
  • 终极HsMod配置指南:60+功能全面解锁炉石传说高级体验
  • 嵌入式C开发避坑指南:MISRA C:2012 AMD2(2020版)中最容易被忽略的5条规则详解
  • AI代理成本优化:三分钟止血方案与长期降本策略
  • NextChat开源对话系统:自托管、多模型与全链路可控AI工作流
  • C#猜数字游戏:从控制台Demo到工程级实践
  • 手把手教你用BW16模组连接安信可透传云(附AT指令避坑指南)
  • 跨平台开发实战:应对生态割裂的架构策略与Flutter应用
  • redis-线程模型
  • AI代理开始替人干活后,最先掉链子的不是模型,而是你的向量引擎
  • AI智能体工程化实践:从模型调用到工具集成的四大构建方向
  • ARM调试寄存器体系与CLAIM标签机制详解
  • Unity不规则网格建造系统:从顶点编辑到布尔运算的实时生成方案
  • Excel与Tableau协同实战:从数据录入到智能分析的无缝衔接
  • Flutter原理与混合栈开发深度解析
  • Claude API成本优化实战:从定价模型到五大降本策略
  • 国产多模态大模型:重塑游戏开发的“中国引擎”
  • 深度学习篇---车道线语义分割
  • 构建混合AI Agent工作流:平衡本地模型与云端API的成本与效能
  • 从“喂喂喂”到“你好”:拆解2G GSM如何把你的声音变成数字信号(含语音编码与信道编码详解)
  • 别只当便利贴!Simulink注释的5个高阶玩法:从公式到超链接,让你的模型文档活起来
  • 渐进式披露:AI产品人机交互设计实践与工程实现
  • 别再裸奔了!从单片机while(1)到FreeRTOS任务,嵌入式开发的思维跃迁
  • 为什么架构师越老越值钱?越陈越香的IT界茅台
  • 你的无人机为什么飞不稳?从APM/PIX飞控参数调试到云台增稳的实战排查手册
  • 别再只把RenderTexture当截图工具了!Unity中这5个实战用法让你的游戏效果翻倍
  • 教育机构搭建AI编程辅导平台时如何利用Taotoken管控成本
  • 2026年4月优秀的变频器回收企业推荐,西门子变频器回收/三菱变频器回收/欧姆龙PLC回收,变频器回收商家推荐 - 品牌推荐师
  • [技术讨论] MCU究竟是怎么玩转全局变量的