Netty引导类(Bootstrap类的解析)

本文详细解析了Netty的引导类Bootstrap,包括Bootstrap、ServerBootstrap和ClientBootstrap的类关系和作用。Bootstrap作为框架入口,用于组装ChannelFactory、ChannelPipeline等。ServerBootstrap和ClientBootstrap分别处理服务端和客户端的连接。文中还深入探讨了Netty的事件驱动机制,解释了如何通过Reactor模式实现高效的并发连接处理,强调了Main Reactor和Sub Reactor模式在处理连接和读写事件中的优势。

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

Bootstrap 引导类

前面讲解了Netty整体架构以及类之间的关系,然后下面就先从框架的入口引导类(就是一个帮助类,存放了一些框架启动时必要的属性,例如ChannelFactory、ChannelPipeline、Map<String,Object> options)开始,看看是如何把这些类组装在一起的。

类关系

Bootstrap:封装了一些服务端和客户端引导类公共的逻辑,通过构造函数初始化参数

ServerBootstrap:继承了Bootstrap,组装了服务端所需要的相关的类 (创建的是需要连接的channel tcp/ip)

ClientBootstrap:继承了Bootstrap,组装了客户端所需要的相关的类 (创建的是需要连接的channel tcp/ip)

ConnectionlessBootstrap:继承了Bootstrap,(创建的是无需连接的channel udp/ip)

Bootstrap

该类提供了公共的数据结构,有创建Channel工厂、初始化了ChannelPipeline和ChannelPipelineFactory、存放了配置Channel参数的Map。

在这里插入图片描述

图-bootstrap0

两个构造方法,一个是无参的,一个是有ChannelFactory(创建Channel对象的工厂),如果在新建类时没有传入,那么一定需要调用setFactory方法传入(如果已经设置了channel factory那么就抛出IllegalStateException异常)

注意: 默认ChannelPipelineFactory 中的实现就是将pipeline中的ChannelHandler浅拷贝到新的DefaultChannelPipeline中,如果对于服务端接受多个Channel时,若ChannelHandler是有状态的话就会有线程安全问题(因为在没有同步情况下,多个线程操作同个内存资源),就必须要自己实现ChannelPipelineFactory接口来创建ChannelPipeline(这样每次获取pipeline都会重新new一个ChannelHandler)。

Map<String,Object> options 存放配置channel的信息,如果给子channel(有服务端接受客户端的channel)配置需要在key的名字用child前缀 例如:child.keepAlive

实现了ExternalResourceReleasable接口,表示该类支持释放外部资源,就是调用factory.releaseExternalResources()方法

ServerBootstrap

下面看看ServerBootstrap是如何绑定某个端口的,做了哪些操作

下面看bind操作,在某个ip和某个端口上进行监听客户端连接操作

Channel bind():会从options获取 key=localAddress,然后会调用bind(SocketAddress localAddress)方法

Channel bind(SocketAddress localAddress) 该方法最终会调用bindAsync(SocketAddress localAddress)方法,该方法是一个异步的,操作结果并不会马上获取到,当一有结果就会notify 添加的ChannelFutureListener,并唤醒阻塞等待结果的线程。 ChannelFututre中的awaitUninterruptibly方法就是会一直阻塞等待结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值