前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty 编码与数据的写入

Netty 编码与数据的写入

作者头像
良辰美景TT
发布2018-12-24 11:10:59
8110
发布2018-12-24 11:10:59
举报
文章被收录于专栏:java、Spring、技术分享
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无法写入新的数据。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.12.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Netty 编码
  • HeadContext写入数据
    • write过程
      • flush过程
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档