【Netty】Netty的使用和原理分析

超详细Netty入门,看这篇就够了! 本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。官方的介绍:Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 阅读详情

一、应用场景

目前,部分的硬件厂商对接硬件要求需要基于TCP协议发送报文的形式,以及可能部分系统做集成时都需要基于TCP协议,建立Socket通道,发送实时消息,相信很多接触过Java的,都使用过Socket编程,包括BIO/NIO/AIO,但是这些编程起来较为复杂,Netty很好的帮我们简化了这些配置的流程,让我们更方便的使用。

二、Netty的使用

我们先不谈原理,先来看看Netty是如何使用的。

jar包:

    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-all</artifactId>
      <version>5.0.0.Alpha2</version>
    </dependency>

Socket需要一个服务端和客户端

2.1 服务端

服务端的创建

public static void main(String[] args) throws Exception {
    // 创建两个线程组bossGroup和workerGroup,含有的子线程NioEventLoop的个数默认为cpu核数的两倍
    // bossGroup只是处理连接请求,真正的和客户端业务处理,会交给workerGroup完成
    // 这里面的int值参数代表了要创建的线程数量
    EventLoopGroup bossGroup = new NioEventLoopGroup(1);
    EventLoopGroup workerGroup = new NioEventLoopGroup(8);
    try {
        // 创建服务器端的启动对象
        ServerBootstrap bootstrap = new ServerBootstrap();
        //使用链式编程来配置参数
        bootstrap.group(bossGroup,workerGroup) //设置两个线程组
            //使用NioServerSocketChannel做为服务器的通道实现
            .channel(NioServerSocketChannel.class)
            // 初始化服务器连接队列大小,服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接。
            // 多个客户端同时来的时候,服务端将不能处理的客户端连接请求放在队列中等待处理
            .option(ChannelOption.SO_BACKLOG,1024)
            //创建通道初始化对象,设置初始化参数
            .childHandler(new ChannelInitializer<SocketChannel>(){
                
                @Override
                protected void initChannel(SocketChannel ch)throws Exception {
                    //对workerGroup的SocketChannel设置处理器
                    ch.pipeline().addLast(new NettyServerHandler());
                }
            });
        sout("netty server start...")
            // 绑定一个端口并且同步,生成一个ChannelFuture异步对象,通过isDone()等方法可以判断异步事件的执行情况
            // 启动服务器(并绑定端口),bind是异步操作,sync方法是异步操作完毕
            ChannelFuture cf = bootstrap.bind(9000).sync();
        //给
    }
}

服务端收发消息的处理类 

这里注意这个ChannelHandlerContext参数,如果要发送消息 ,需要通过这个参数,如果外部的方法中需要发送消息,可以将这个参数赋给一个全局的变量。

public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    // 客户端连接
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
    }

    // 客户端发送信息
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        super.channelRead(ctx, msg);
    }

    // 数据读取完毕时的处理方法
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ByteBuf buf = Unpooled.copiedBuffer("HelloClient".getBytes(CharsetUtil.UTF_8));
        ctx.writeAndFlush(buf);
    }
}

2.2 客户端

客户端的创建

public static void main(String[] args)throws Exception {
// 客户端需要一个事件循环组
EventLoopGroup group = new NioEventLoopGroup();
try {
// 创建客户端启动对象
// 注意客户端使用的对象不是ServerBootstra而是Bootstrap
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());
        }
    });
    sout("netty client strat..");
        //启动客户端去连接服务器端
        ChannelFuture cf = bootstrap.connect("127.0.0.1",9000).sync();
    //对通道关闭进行监听
    cf.channel().closeFuture.sync();
} finally  {
    group.shutdownGracefully();
}
}

客户端处理类

public class NettyClientHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelActive(ChannelHandlerContext ctx){
        ByteBug buf = Unpooled.copiedBuffer("HelloServer".getBytes(CharsetUtil.UTF_8));
        ctx.writeAndFlush(buf);
    }
    
    @Override
    public void  channelRead(ChannelHandlerContext ctx,Object msg){
        ByteBuf buf = (ByteBuf)msg;
        sout("收到服务端发送的消息" + bug.toString(CHarsetUtil.UTF_8);
    }
}

基本的使用就是这样了,下面我们来看一下Netty的底层

三、Netty底层

3.1 通信模型

我们先来看一张Netty底层的通信模型,这张图是从网上找到的,画的很不错

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_20,color_FFFFFF,t_70,g_se,x_16

 这里有一个多路复用器Selector的概念

如果想详细了解这个概念,这里有一篇博客专门讲这个:多路复用器Selector

这里大概讲一下Selector的作用,在Netty中,它主要起到了监听的作用,用来监听的一个IO操作有没有发生数据的交互,如果发生了,它可以判断这个操作是读操作,还是连接操作,如果是连接操作,服务端的BossGroup首先将这个连接放入WorkerGroup中的队列中去,然后进行我们配置的处理类里面的过程,如果是读操作,就会被WorkerGroup中的Selector监听到,进行我们编写的读操作的逻辑,Netty实现的是NIO的操作,所以线程之间不会发生阻塞。

3.2 Netty的零拷贝

再来说说Netty的零拷贝

首先要明确一点,没有真正意义上的零拷贝,我们这里说的零拷贝,是指Java虚拟机没有对数据进行再次的拷贝,而是直接处理。

传统Socket的操作:

操作系统在进行Socket通信操作时,接收到的数据会分配到操作系统的直接内存当中,所谓的直接内存,就是宿主机的内存,不是java虚拟机管理的内存。而我们的Java程序想要操作Socket传来的数据,需要将直接内存中的数据拷贝到java虚拟机中来进行操作。

Netty的实现 :

与传统Socket操作不同的地方是,Netty在操作Socket传来的数据时,不会将这些数据拷贝到Java的虚拟机中来,而是直接给出这些数据的引用,指向这些数据的地址,进行数据操作时,直接操作的是直接内存,所以还是有拷贝的,只不过没有拷贝到虚拟中来。

Netty 源码 — 线程模型的分析 文章目录Netty 线程模型分析Reactor 线程模型Netty 初始化线程池BossGroup 工作原理绑定 Channel事件循环执行 IO 事件WorkerGroup 工作总结 Netty 线程模型分析 阅读本文之前,需要了解 NIO 相关知识,可参阅我的文章:[NIO 与 epoll 知识详解](./NIO 与 epoll.md) Reactor 线程模型 Netty 的线程模型 是基于 Reactor 线程模型的,Reactor 线程模型分为三种模型: 单线程模型:注册所有感兴趣的事件,一 阅读详情

相关推荐

Netty中的bytebuf使用直接内存和池化技术的意义在哪,以及具体的使用场景

Netty中的bytebuf使用直接内存和池化技术的意义在哪,以及具体的使用场景

weixin_59244784的博客 758

搭建简单的Netty开发环境

今天准备学学声明显赫的Netty框架,自然要先学会怎么搭建一个简单的Netty开发环境啦。话不多说,下面进入正文。 编辑器方面自然是推荐IntelJ idea了,idea的强大不必多说,百度一下你就知道。哈哈 下面就是准备Netty的jar包了,如果你会maven的话自然是使用maven最为方便了。只需要在pom文件中导入以下几行 &lt;!-- https://mvnrepository...

Stormer的博客 2万+

物联网netty对接socket设备-netty定义

netty定义1.netty定义2.阻塞与非阻塞3.同步与异步 1.netty定义 简单来讲,Netty是一个提供了易于使用的API的客户端/服务端框架。Netty并发非常高,一个非阻塞的IO,Netty传输速度也非常快,因为他是0拷贝,什么是零拷贝?NIO中的特性之一就是零拷贝,在Java中,内存分为堆和栈以及字符串常量值等等,如果有一些数据从IO中读取并且放到堆里面,中间会经过一些缓冲区。 具体来讲,如果要从IO中读取数据,分为两个步骤: (1)从IO流中读取出来放到缓冲区,程序从缓冲区中读取,再放到堆中,此时数据就会被拷贝两次才能到达堆或者堆内存中。如果数据量很大,那么就会造成资源的浪费

Netty(二)

Netty一、Netty概述1.1 原生NIO存在的问题1.2 Netty官网说明 一、Netty概述 1.1 原生NIO存在的问题 NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor模式,你必须对多线程 和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都非常大:例如客户

残影的博客 1387

3个PLC进阶教程实战项目,学完立即接私单!

此处应插入清晰的硬件电路图,包含土壤湿度传感器、水泵、PLC的输入输出端子,并标注清晰的接线方式。同样的,也需要插入清晰的梯形图,用简单的逻辑表达控制过程,比如:土壤湿度传感器信号低于设定值 -> PLC输出信号 -> 水泵启动。我是老王,一个在自动化行业摸爬滚打多年的老工程师,今天咱们不聊那些枯燥的理论,直接上手三个PLC进阶实战项目,学完保证你信心满满,立马就能接私单!想想你家里的空调,它也是通过检测室温,并根据设定的温度进行制冷或制热,这个项目就是类似的原理。

qq_38220914的博客 1469

01 AUTOSAR CP标准文档阅读指南

01 AUTOSAR CP标准文档阅读指南

汽车软件工程师 | 好奇博主 | 处女座 1133

Netty使用案例 -优雅退出原理和源码分析

Netty优雅退出涉及线程组,NIO线程,Channel和定时任务等,底层实现细节比较复杂。看看源码是怎么实现的。 NioEventLoopGroup NioEventLoopGroup实际上是NioEventLoop线程组,它的优雅退出比较简单,可直接遍历EventLoop数组,循环调用它们的shutdownGracefully方法,源码 public abstract class Multit...

Hello Word 447

PIN限幅二极管在接收机中的应用

本文介绍了接收机保护限幅器的工作原理及应用,重点阐述了PIN二极管在雷达收发机中的关键作用。文章指出,限幅器能有效保护接收机灵敏元件免受大功率信号损害,主要通过反射而非耗散功率来实现保护功能。文章详细分析了PIN二极管的层结构特性及其阻抗变化机制,解释了多级限幅器的设计原理(包括清理级和粗限幅器的配合使用),并介绍了通过添加检波二极管降低阈值水平的方法。最后指出,实际应用中限幅器通常采用3级或更少的设计。

weixin_49761275的博客 2370

「Netty系列」使用wireshark对网络通信扑捉,进行三次握手和四次挥手原理分析(Netty前置二)

正常下班,文章走起。在网络的通信的时候,都有听说过三次握手四次挥手。但是对其原理是否清晰?本篇文章通过使用wireshark对网络通信扑捉,进行原理分析。 1 BIO代码实现 //服务端代码 publicclassServerSocket{ publicstaticvoidmain(String[]args)throwsException{ //创建ServerSocket对象,用于客户端的连接 java.net.ServerSo...

flowerAndJava的博客 478

医疗AI Agent实战:从零搭建一个能看病的智能助手(附完整代码)

本文详细介绍了如何从零搭建一个医疗AI Agent智能助手,涵盖核心架构设计、症状推理引擎开发、安全与合规实现以及系统集成等关键环节。通过完整的代码示例和实战案例,帮助开发者快速构建具备医疗咨询能力的智能Agent,提升医疗服务的效率和质量。

ss78901的博客 465

STM32实战:5分钟搞定CanFestival协议栈下的CANopen心跳报文配置(附避坑指南)

本文详细介绍了如何在STM32平台上使用CanFestival协议栈快速配置CANopen心跳报文,包括硬件准备、协议栈移植、心跳报文配置及常见问题解决方案。通过实战步骤和避坑指南,帮助开发者高效实现节点状态监控,提升工业控制系统的可靠性。

win55的博客 744

netty 图解_这可能是目前最透彻的Netty原理架构解析

“本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给大家在实际开发实践、学习开源项目方面提供参考。Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。JDK 原生 NIO 程序的问题JDK 原生也有一套网络应用程序 API,但是存在一系列问题,主要如下:NIO 的类库和 API 繁杂,使用麻烦。你...

weixin_39616961的博客 510

YOLOv13优化:PoolingFormerCGLU模块 MetaFormer 框架 + 池化混合器 手把手教你自注意力

PoolingFormer1 是一个基于 MetaFormer 框架 的轻量化卷积-Transformer 混合模块,通过 Pooling 取代自注意力,实现: 更低的计算成本 一定的全局信息融合 兼容 CNN 和 Transformer 的优点

FJN110的博客 424

Netty - 回顾Netty高性能原理和框架架构解析

Netty 是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件、整体架构。@Override。

小工匠 9272

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1418

RK3568 上C图像camera图像采集应用实例(二)

本文探索rk3568上实现C语言的 通过C v4l2 接口 采集图像 ,刷屏控制 drm的显示camera图像中 实现camera preview 预览 的实践和探索。

luoshanxuli2010的专栏 758

Netty基础、使用与源码总结

Netty是基础Java Nio封装的网络编程框架,基于TCP或UDP四层协议进行流式网络编程。本文件从NIO,Netty使用与源码进行总体概述性分析。

lizhengjava的博客 1477

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Netty原理架构解析

本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给大家在实际开发实践、学习开源项目方面提供参考。 Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 JDK 原生 NIO 程序的问题 JDK 原生也有一套网络应用程序 API,但是存在一系列问题,主要如下: NIO 的类库和 API ...

哖少 214

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

这可能是目前最透彻的Netty原理架构解析

这可能是目前最透彻的Netty原理架构解析 公众号:池哥搬砖 QQ1群:745460286 个人WX 公号: 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给大家在实际开发实践、学习开源项目方面提供参考。 Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 ...

Link的专栏 609

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[强烈推荐] 新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析

新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析 1、引言 Netty是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 本文基于Netty 4.1展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给大家在实际开发实践、学习开源项目方面提供参考。 本文作者的另两篇《高性能网络编程(五):一...

优秀技术文章收录 1229

最透彻的Netty原理架构解析

本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给大家在实际开发实践、学习开源项目方面提供参考。 Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 JDK 原生 NIO 程序的问题 JDK 原生也有一套网络应用程序 API,但是存在一系列问题,主要如下: NIO 的类库和 API 繁杂...

absolute_chen的博客 411

什么是netty--通俗易懂

一.Netty介绍 1.什么是netty Netty是由JBOSS提供的一个Java开源框架。Netty提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络IO程序,是目前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,知名的Elasticsearch、Dubbo框架内部都采用了Netty。 2.为什么要用netty 原生NIO存在问题: 1.NIO的类库和API繁杂 2.需...

lisheng19870305的专栏 1万+

从BIO到NIO到Netty,从阻塞IO到Reactor模型深度剖析Netty核心原理(干货)

很想写一篇关于Netty的剖析,但是只写Netty有些童鞋可能会一脸懵,这篇文章从浅入深,从BIO到NIO讲了个透彻,最后再讲到Netty底层原理,期间也是翻阅资料,也算是自己对相关知识的总结和复习吧~~ 1、什么是I/O模型?什么是BIO NIO AIO?三者有什么区别? 2、AIO性能更好,为什么Netty不使用AIO? 3、Redis、Nginx等为什么这么快? 4、Netty相比NIO有何优势?底层如何实现? 这些问题希望看完这篇文章之后都能找到答案~~ 目录 一、I/O模型 1..

Harrison 844

【Netty】NIO与Netty核心概念

Netty核心概念

qq_43745578的博客 1278

Netty对象池技术详解:原理、实现与最佳实践

/ 重置状态Netty对象池通过精妙的线程局部存储+层级化回收机制,在保证线程安全的前提下实现了高效的对象复用。合理使用该技术可使QPS提升5-10倍,同时降低GC停顿时间达80%以上。建议在开发网络应用时优先考虑使用对象池管理高频创建的对象。

一位努力搬砖程序员。在这里,我会分享关于编程技巧、项目实战经验以及对新技术的见解。希望通过我的文章能够帮助你在技术路上更进一步。期待与你共同学习和成长! 991

尚硅谷2019年Netty教程 netty 源码分析 ---- 目标netty---step6.10

netty服务器启动 1 2 3 https://www.bilibili.com/video/BV1jK4y1s7GV?p=92 — 25 https://www.bilibili.com/video/BV1jK4y1s7GV?p=93 — 5 https://www.bilibili.com/video/BV1jK4y1s7GV?p=94 — 25 netty接受请求 1 2 3 https://www.bilibili.com/video/BV1jK4y1s7GV?p=95 — 25

狗剩的专栏 485
上一篇: 【Java进阶】java函数式编程的使用
下一篇: 【Jenkins】Jenkins实现自动部署后台应用,自动部署Maven项目,钩子触发器
JeffHan^_^
博客等级 码龄7年 1万+粉丝 134原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffHan^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值