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無法寫入新的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章