BootStrap
一个Netty应用通常从一个BootStrap开始,由于配置整个程序
BootStrap是配置客户端的启动引导类
ServerBootStrap是配置服务端的启动引导类。
常用方法
- ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup)用于设置BossGroup、workGroup
- B group(EventLoopGroup group) 用于设置客户端Group
- B channel(Class<? extends C> channelClass) 设置通道实现,根据传入的类反射生成
- B option(ChannelOption option, T value) 给ServerChannel添加配置
- ServerBootstrap childOption(ChannelOption childOption, T value) 给接收到的通道添加配置
- ServerBootstrap childHandler(ChannelHandler childHandler) 用来设置业务处理类
- ChannelFuture bind(int inetPort) 用于客户端绑定端口
- ChannelFuture connect(String inetHost, int inetPort) 用于客户端连接服务端
childHandler用于workGroup即childGroup
handler用于bossGroup即parentGroup
Future、ChannelFuture
Netty的操作都是异步的,不能立即得知执行结果。但是可以根据监听器,当操作成功或失败时会自动触发注册的监听事件。
常见方法:
- channel 返回当前正在进行的IO通道
- sync 等待异步执行结果操作完毕
Selector
Netty基于Selector实现多路复用,通过Selector监听多个Channel,Selector不断的查询注册的Channel是否有就绪的IO事件。
ChannelHandler
ChannelHandler是一个接口,处理IO事件或拦截IO事件,并将其转发到ChannelPipeline中的下一个处理程序。
ChannelHandler有很多子类。
- ChannelInboundHandler接口处理入站IO事件
- ChannelOutboundHandler接口处理出站IO事件
- ChannelInbondHandlerAdapter类用于处理入站IO事件
- ChannelOutboundHandlerAdapter类用于处理出站IO事件
出站:Server读管道中的数据为出站
入站:Server向管道写数据为入站
ChannelHandler中的方法
- ChannelActive通道就绪事件
- ChannelRead通道读取事件
- ChannelReadComplate通道读取完毕事件
- exceptionCaught通道异常事件
- channelRegister 通道被注册
- channerlUnRegister 通道被注销
- handlerAdd 处理器被添加
- handlerRemove 处理器被移除
ChannelHandlerContext
保存Channel所有的上下文信息,同时关联一个ChannelHandler对象。
通过ChannelHandlerContext,可以获取channel、pipeline、handler。
- close 关闭通道
- flush 刷新
- write写数据
ChannelOption
设置参数.
- ChannelOption.SO_BACKLOG :对应tcp/ip协议中的backlog参数,用来初始化服务器可连接队列大小。
- ChannelOption.KEEP_ALIVE :保持连接活动状态
EventLoopGroup及其子类NioEventLoopGroup
EventLoopGroup本质上是一个线程组,并且是可迭代的。
每次需要调用时,通过next获得一个EventExecutor执行。
在Server端需要两个EventLoopGroup,bossEventGroup负责接收连接,workEventGroup负责进行IO处理。
常用方法:
- shutdownGracefully :断开连接,关闭线程
Upool
ByteBuf
类似于NIO中的ButeBuffer。但不同的是,ByteBuffer需要filp读写转换,而ByteBuf不需要。
原因是ByteBuf有readerIndex和writerIndex,分别记录下一个要读/写的位置。
0 <= readerIndex <= writerIndex <= capacity
//ByteBuf buffer = Unpooled.copiedBuffer("hello,world", CharsetUtil.UTF_8);
ByteBuf buffer = Unpooled.buffer(10);
for (int i = 0; i < buffer.capacity(); i++) {
buffer.writeByte(i);
}
for (int i = 0; i < buffer.capacity(); i++) {
// getByte方法是根据下标读取,所以不会导致readerIndex+1
// 而readByte可以
System.out.println(buffer.readByte());
}
常用方法
- array : 获取array
- readerIndex :获取readerIndex
- readableBytes :剩余可读的数量(从readerIndex到writerIndex)