Netty-核心组件

1.Bootstrap和ServerBootstrap

Bootstrap是Netty的启动程序,⼀个Netty应⽤通常由⼀个Bootstrap开始。Bootstrap的主要作⽤是配置Netty程序,串联Netty的各个组件。

  • Bootstrap: 客户端的启动程序
  • ServerBootstrap:服务端启动程序

2.Future和ChannelFuture

Netty的所有操作都是异步的,即不能⽴刻得知消息是否被正确处理。因此需要通过Future和ChannelFuture来注册监听器,当操作执⾏成果或者失败来调⽤具体的监听器。

Future通过sync⽅法来获得同步执⾏的效果。

ChannelFuture和Future的子类,提供了针对于Channel的异步监听操作。

3.Channel

Channel是Netty⽹络通信的重要组件,⽤于执⾏⽹络IO操作。Channel具备以下能力:

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

  • 网络连接的配置参数

  • 提供异步的⽹络IO操作,⽐如建⽴连接、绑定端⼝、读写操作等

  • 获得ChannelFuture实例,并注册监听器到ChannelFuture上,⽤于监听IO操作的成功、失败、取消时的事件回调。

Channel具体的实现类有以下几种:

  • NioSocketChannel: 异步的客户端TCP Socket连接通道

  • NioServerSocketChannel:异步的服务端TCP Socket连接通道

  • NioDatagramChannel:异步的UDP连接通道

  • NioSctpChannel:异步的客户端Sctp连接通道

  • NioSctpServerChannel:异步的服务端Sctp连接通道

4.Selector

通过Selector多路复⽤器实现IO的多路复⽤。Selector可以监听多个连接的Channel事件,同时可以不断的查询已注册Channel是否处于就绪状态,实现⼀个线程可以⾼效的管理多个Channel。

5.NioEventLoop

NioEventLoop内部维护了⼀个线程和任务队列,⽀持异步提交执⾏任务。当线程启动时会调用NioEventLoop的run⽅法来执⾏io任务或非io任务。

  • io任务:如accept、connect、read、write事件等,由processSelectedKeys方法触发。

  • 非io任务:如register0、bind0等任务将会被添加到taskQueue任务队列中,由runAllTasks⽅法触发。

6.NioEventLoopGroup

管理NioEventLoop的⽣命周期,可以理解为是线程池,内部维护了⼀组线程。每个线程(即NioEventLoop)负责处理多个Channel上的事件。注意,⼀个Channel只对应⼀个线程,NioEventLoop和Channel它们是⼀对多的关系。

7.ByteBuf

ByteBuf优化了ByteBuffer的使⽤逻辑。ByteBuf底层是⼀个字节数组组成,它提供了两个指针分别标识可读的位置和可写的位置,配合capacity容量属性,将数组划分成三个区域,分别为:

  • 已经读取的区域:[0, readerIndex)

  • 可读取的区域:[readerIndex,writerIndex)

  • 可写的区域:[writerIndex,capacity)

在这里插入图片描述

public class ByteBufDemo {
    public static void main(String[] args) {
        // 创建一个容量为10的ByteBuf对象
        ByteBuf buf = Unpooled.buffer(10);
        System.out.println("init buf:" + buf);

        for (int i = 0; i < 5; i++) {
            buf.writeByte(i);
        }
        System.out.println("after write:" + buf);

        // 读数据
        // 按照索引获取数据
        for (int i = 0; i < 3; i++) {
            System.out.println(buf.getByte(i));
        }
        System.out.println("after get:" + buf);
        //读取数据
        for (int i = 0; i < 3; i++) {
            System.out.println(buf.readByte());
        }
        System.out.println("after read:" + buf);

        System.out.println("readIndex: " + buf.readerIndex());
        System.out.println("writerIndex: " + buf.writerIndex());
        System.out.println("writerIndex(8): " + buf.writerIndex(8));
        System.out.println("capacity: " + buf.capacity());
    }
}

8.ChannelHandler

ChannelHandler用于处理拦截IO事件,往往在ChannelHandler中可以加⼊业务处理逻辑。ChannelHandler执⾏完后会将IO事件转发到ChannelPipeline中的下⼀个处理程序。

9.ChannelHandlerContext

保存Channel相关的上下⽂信息,并关联⼀个ChannelHandler对象

10.ChannelPipeline

ChannelPipeline是⼀个双向链表,其中保存着多个ChannelHandler。

ChannelPipeline实现了⼀种⾼级形式的过滤器模式,在IO操作时发⽣的⼊站和出站事件,会导致ChannelPipeline中的多个ChannelHandler被依次调⽤。

  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值