Netty 编码与数据的写入

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无法写入新的数据。

推荐阅读更多精彩内容