Channel:程序与资源的通道。在Java通信中类Socket。
ChannelHandler:处理特定事件的回调方法
Future:一个异步操作的结果占位符,ChannelFuture接口。netty中都是异步返回ChannelFuture
ChannelFutureListener:ChannelFuture的回调方法,取ChannelFuture的结果
EventLoopGroup:通过event loop选择Channel
ServerSocketChannel:接收新连接
如果ChannelHandler未实现exceptionCaught捕捉异常,异常将随着pipeline向下传递,直至结尾并记录。
可以保证ChannelFuture按代码执行顺序执行返回结果。
当ChannelHandler被添加到ChannlePipeline,会关联ChannelHandlerContext,其中关联ChannelHandler和ChannelPipeline。
Handler只能处理方向相同且泛型类型相同的数据!
发送数据两种方式:
1.直接发送到Channel
2.使用ChannelHandlerContext关联的ChannelHandler
区别:第一种是从ChannelPipeline尾到头;第二种是发送到next ChannelHandler;
Netty提供了实现ChannelHandler接口的adapter类,会自动将event传递到ChannelPipeline中next handler。
inbound数据将被decoded;outbound数据将被encoded;
Zero-copy:零复制仅在Nio和epoll下可用。它允许快速的将文件从系统中传输到网络,而不需要从内核空间copy到用户空间。但是,它不能用在加密数据和压缩数据等方面,仅能原生数据。当然,如何数据本身是加密的,那也没问题。
ByteBuf 以read和write开头的方法会推进相应的索引,而get和set方法不会。 容量默认最大值 Integer.MAX_VALUE。
ByteBuf模式分类:
1.Heap ByteBuf
2.Direct ByteBuf
3.Composite ByteBuf
Channel生命周期
ByteBuf被消耗或丢弃并且没有传递到下一个handler,则应该release资源。被写到传输层或Channel被关闭时,自动release。SimpleChannelInboundHandler默认Read0自动释放资源。
ChannelHandlerContext有与ChannelHandler和ChannelPipeline同名的方法,但ChannelHandlerContext中的方法只在与之关联的ChannelHandler并仅仅传递到下一个ChannelHandler。而ChannelHandler和ChannelPipeline中方法传递整个pipeline。
decoder(ChannelHandler, ByteBuf, List):list添加decode后的message;这个方法会重复调用,直到Bytebuf无可读数据(需判断可读字节)。如果list不为空,则传递到下一个handler。
decoded和encoded会自动调用ReferenceCountUtil.release()释放资源,如果想保留可以调用ReferenceCountUtil.retain()