一、概述
handler是控制socket io的各个生命周期的业务实现,netty实现了很多种协议所以有很多handler类,这儿主要关注Handler的设计、作用以及使用方法。
二、Channel
Channel与JDK中的Channel作用相当,是对I/O操作的封装,比如read(),write(),connect(),close()和bind()等,是Netty中核心对象。我们经常使用的NioServerSocketChannel,NioSocketChannel就是其具体实现。Channel的状态改变都会触发相应事件传递到Pipeline中,被ChannelHandler处理,下面为Channel经常触发的事件:
事件 |
说明 |
ChannelRegistered |
这里的注册强调的是Channel与EventLoop是否关联,满足下列条件才能称为registered: 1. 将相关socket注册到selector上 ; 2. Channel与EventLoop关联起来 |
ChannelActive |
满足下列两个条件,就是active了: 1. channel 完成了注册; 2. channel 绑定到了本地端口(对NioServerSocketChannel而言)或连接到了远程主机(对NioSocketChannel而言) |
三、ChannelHandler
ChannelHandler 是处理数据的核心对象,其对源端Channel触发的一系列事件进行处理。Netty提供了两个非常重要的子接口:
1、ChannelInboundHandler
ChannelInboundHandler方法如下图所示,从方法名可看出,其是对Channel触发事件的处理。
channelRegistered
在channel注册到线程池的时候会被触发。
channelUnregistered
在channel关闭的时候触发。
channelActive
registered完成之后且channel处理active状态,首次注册状态。主要见AbstractChannel的register0(promise)方法。
channelnactive
unregistered之前执行,主要见AbstractChannel的deregister方法。
channelRead
这个主要见pipeline的fireChannelRead方法,其被channel在获取到数据的阶段进行调用,进而触发到handler的channelRead方法。
channelReadComplete
这个和上面read方法一样,fireCh