当前位置: 首页 > 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.gsyq.cn/news/1387788.html

相关文章:

  • HyperMesh防崩溃神器:手把手教你配置自带的autosave.tcl脚本(附开机自启动教程)
  • 多智能体协同进化:AI驱动科学机器学习建模策略创新
  • AI代理成本优化:三分钟止血方案与长期降本策略
  • pad.ws:白板与代码编辑器合二为一的创新工具,打造无缝开发体验
  • redis-线程模型
  • Unity Animator深度解析:状态机原理与性能优化实战
  • AI智能体工程化实践:从模型调用到工具集成的四大构建方向
  • Unity不规则网格建造系统:从顶点编辑到布尔运算的实时生成方案
  • 构建自动化文献处理流水线:从PDF解析到结构化数据提取
  • 别再裸奔了!从单片机while(1)到FreeRTOS任务,嵌入式开发的思维跃迁
  • 2026年4月优秀的变频器回收企业推荐,西门子变频器回收/三菱变频器回收/欧姆龙PLC回收,变频器回收商家推荐 - 品牌推荐师
  • 跨平台开发实战:应对生态割裂的架构策略与Flutter应用
  • 别再瞎调参数了!遗传算法选择、交叉、变异算子实战避坑指南(附Python代码)
  • 目视初检+万用表快测,PCB元件损坏快速定位法
  • 基于TypeScript与NeuroLink构建企业级AI代理:架构设计与实战指南
  • 为什么说 2026 是“Agentic Workflow”爆发元年?生态工具链全景图
  • 为什么架构师越老越值钱?越陈越香的IT界茅台
  • Unity PC单exe封装实战:嵌入式资源方案详解
  • Unity打包安卓报错?手把手教你修改build.gradle解决资源冲突(附Gradle模板配置)
  • 终极指南:如何用开源分屏工具实现单机游戏多人同乐
  • Hakira平台实战:模块化低代码数据探索与自动化分析工作流搭建
  • 别再手动复制粘贴了!用Stata的logout和esttab,5分钟搞定论文标准表格
  • 别再写重复代码了!用这个Spine动画管理器搞定Unity中的角色动作切换与回调
  • 低碳物流网络设计与评价【附代码】
  • Flutter原理与混合栈开发深度解析
  • 项目一拖再拖、成本失控?企业破局关键在这!
  • 告别外设不足:用MCP2517FD给ESP32或树莓派Pico扩展CAN FD接口实战
  • 告别SD卡!手把手教你为EBAZ4205矿卡配置NAND启动的JFFS2根文件系统(Petalinux 2018.3)
  • SAP财务凭证替代避坑指南:从VF01销售发票到MIRO发票校验,AC_DOCUMENT BADI的字段映射与性能考量
  • 从二极管门到TTL/CMOS:聊聊数字IC设计里那些‘古老’却至关重要的工程权衡