www.zhblog.net

Netty中重要的概念

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;

20200903151117138.png


20200903151204171.png


20200903155442736.png


Zero-copy:零复制仅在Nio和epoll下可用。它允许快速的将文件从系统中传输到网络,而不需要从内核空间copy到用户空间。但是,它不能用在加密数据和压缩数据等方面,仅能原生数据。当然,如何数据本身是加密的,那也没问题。


ByteBuf 以read和write开头的方法会推进相应的索引,而get和set方法不会。 容量默认最大值 Integer.MAX_VALUE。


20200904110532702.png


ByteBuf模式分类: 

1.Heap ByteBuf 

2.Direct ByteBuf 

3.Composite ByteBuf


Channel生命周期

20200907105047891.png


20200907113623374.png


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()



 

展开阅读全文

评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 心情