Netty中的核心概念

本文详细解析了Netty中的事件传播机制,包括事件处理器(ChannelHandler)、ChannelPipeline的工作原理,以及Bootstrap、EventLoop、EventLoopGroup、Channel、ByteBuf等核心概念的应用。同时介绍了Netty的Future和Promise机制,以及ChannelPromise的综合用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事件传播机制

当pipeline中有多个handler时,netty内部的事件是如何向后传递到每个handler中的?

结论:需要在当前handler中手动将当前事件传递下去

1,如果handler是直接实现的接口,使用ChannelHandlerContext的fireXXX方法

2,如果handler是继承Adapter,直接调用父类即可,比如:super.channelRead(ctx, msg);

super.channelRead(ctx, msg);的本质也是调用了Context中的fireActive方法

    @Skip
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
   
   
        ctx.fireChannelActive();
    }

ChannelOutboundHandler 可以用来做什么?

1,响应数据包装,压缩,加密,…等通用功能

ChannelHandler 的执行顺序

BootStrap

1,Bootstrap是引导的意思,它的作用是配置网络参数并引导Netty程序启动,将各个组件都串起来

2,Netty中提供了2种类型的引导类,一种用于客户端(Bootstrap),而另一种(ServerBootstrap)用于服务器,它们之间的区别在于:

  • ServerBootstrap 需要指定绑定的端口,服务器开启监听接收连接,而 Bootstrap 则是想要连接到远程节点故需要对端的地址信息

  • 引导客户端只需要一个EventLoopGroup,服务端一般需要两个

Channel

Netty中的Channel是与网络套接字相关的,底层对应了一个socket连接,它负责基本的IO操作,比如:

  • read(),write() 等,它的一些核心作用有:

  • 获得当前网络连接的通道状态

  • 获得网络连接的配置参数(如缓冲区大小等)

  • 网络I/O操作

EventLoop和EventLoopGroup

1,Netty是基于事件驱动的,比如:连接就绪;数据读取;异常事件等,有了事件,就需要一个组件去监控事件的产生和事件的协调处理,这个组件就是EventLoop(事件循环)

2,Netty 中每个Channel 都会被分配到一个 EventLoop,一个 EventLoop 可以服务于多个 Channel的事件处理

3,每个 EventLoop 会占用一个 Thread,在这个Thread上处理相应的事件

4,EventLoopGroup 包含了一组EventLoop,可以理解成Netty的线程池

EventLoopGroup线程数有多大

// 主线程,不处理任何业务逻辑,只是接收客户的连接请求
EventLoopGroup boss = new NioEventLoopGroup();
// IO线程,处理注册其上Channel的I/O事件及其他Task
EventLoopGroup worker = new NioEventLoopGroup();

默认为当前CPU核心数*2

对于boss group,我们其实也只用到了其中的一个线程,因为服务端一般只会绑定一个端口启动

小结

Bootstrap的作用及类型

1,配置网络参数并引导netty程序启动,

2,ServerBootstrap作用于服务端,Bootstrap作用于客户端

Channel的作用

1,底层绑定的是一个网络连接socket,故可以获取网络通道状态

2,获取相关网络配置参数

3,处理相关操作,如IO

EventLoop和EventLoopGroup 的作用

1,EventLoop 检测并协调处理所注册Channel的相关事件,

2,EventLoop 绑定在一个线程上

3,EventLoopGroup 包含了一组EventLoop,可以理解成Netty的线程池

ChannelPipeline

1,ChannelHandler 是Netty的事件处理器,在其对应的事件回调方法中处理事件,是开发者介入的入口

2,ChannelHandlerContext 持有ChannelHandler并构成双向链表,handler基于它连接pipeline和channel

3,ChannelPipeline 提供了一个了容器,持有ChannelHandlerContext 构成的链表,并连接channel

在刚开始的时候,ChannelPipeline只有head和tail,当接收到了客户端的请求之后,准备初始化ChannelPipeline的时候会回调Handler方法,把Handler方法全都加入在管道当中。

channel中存放着这个套接字的各种信息。

ChannelHandler如何复用?

添加@Sharable注解

SimpleChannelInboundHandler

对于编写Netty数据入站处理器,可以选择继承ChannelInboundHandlerAdapter,也可以选择继承SimpleChannelInboundHandler,区别是什么?

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
   
   
        boolean release = true;<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值