Netty 编码
业务里的数据最终需要通过socket写回到客户端,我们写的业务方法都是面向对象来进行编码的,而channel底层传输的是字节,Netty通过定义encoder来完成对象到字节的转换。自定义的encode可以通过继承MessageToByteEncoder(encoder也是ChannelHandler),下面是MessageToByteEncoder的处理流程。- 匹配对象的细节如下:
- 分配ByteBuf内存:
HeadContext写入数据
我们知道通过channelHandle写入的数据最终会传入到HeadContext的write方法里,下面来看看HeadContext是如何处理这个过程的。
write过程
- 调用unsafe对象执行写入操作:
- driect化ByteBuf并插入写队列
- 通过AbstractNioByteChannel类的filterOutboundMessage方法将byteBuf转成direct类型
- 通过ChannelOutboundBuffer类插入写队列
- 修改可写状态
flush过程
- flsuh过程的入口
- 列新outboundBuffer的数据
- 调用channel的doWrite方法
- 调用jdk底层API进行自旋写
-
对ChannelOutboundBuffer缓存节点进行维护
总结:Netty的写入过程可以分为write与flush,通过ChannelOutboundBuffer对需要写入的数据进行缓存,在ChannelOutboundBuffer里,可以写入的数据都是direct类型的byteBuf。在默认情况下,如果有超过64Kb的数据没有flush,会通知channelHandler无法写入新的数据。
网友评论