原创 netty源碼解析(4.0)-20 ChannelHandler: 自己實現一個自定義協議的服務器和客戶端

  本章不會直接分析Netty源碼,而是通過使用Netty的能力實現一個自定義協議的服務器和客戶端。通過這樣的實踐,可以更深刻地理解Netty的相關代碼,同時可以瞭解,在設計實現自定義協議的過程中需要解決的一些關鍵問題。   本週章涉及到

原创 netty源碼解析(4.0)-11 Channel NIO實現-概覽

結構設計   Channel的NIO實現位於io.netty.channel.nio包和io.netty.channel.socket.nio包中,其中io.netty.channel.nio是抽象實現,io.netty.channel.

原创 netty源碼解析(4.0)-23 ByteBuf內存管理:分配和釋放

       ByteBuf內存分配和釋放由具體實現負責,抽象類型只定義的內存分配和釋放的時機。   內存分配分兩個階段: 第一階段,初始化時分配內存。第二階段: 內存不夠用時分配新的內存。ByteBuf抽象層沒有定義第一階段的行爲,但定

原创 netty源碼解析(4.0)-27 ByteBuf內存池:PoolArena-PoolThreadCache

  前面兩章分析的PoolChunk和PoolSubpage,從功能上來說已經可以直接拿來用了。但直接使用這個兩個類管理內存在高頻分配/釋放內存場景下會有性能問題,PoolChunk分配內存時算法複雜度最高的是allocateNode方法

原创 netty源碼解析(4.0)-16 ChannelHandler概覽

    本章開始分析ChannelHandler實現代碼。ChannelHandler是netty爲開發者提供的實現定製業務的主要接口,開發者在使用netty時,最主要的工作就是實現自己的ChannelHandler。ChannelHan

原创 netty源碼解析(4.0)-19 ChannelHandler: codec--常用編解碼實現

  數據包編解碼過程中主要的工作就是:在編碼過程中進行序列化,在解碼過程中從Byte流中分離出數據包然後反序列化。在MessageToByteEncoder中,已經解決了序列化之後的問題,ByteToMessageDecoder中已經部分

原创 netty源碼解析(4.0)-17 ChannelHandler: IdleStateHandler實現

   io.netty.handler.timeout.IdleStateHandler功能是監測Channel上read, write或者這兩者的空閒狀態。當Channel超過了指定的空閒時間時,這個Handler會觸發一個IdleSt

原创 netty源碼解析(4.0)-14 Channel NIO實現:讀取數據

本章分析Nio Channel的數據讀取功能的實現。   Channel讀取數據需要Channel和ChannelHandler配合使用,netty設計數據讀取功能包括三個要素:Channel, EventLoop和ChannelHand

原创 netty源碼解析(4.0)-18 ChannelHandler: codec--編解碼框架

編解碼框架和一些常用的實現位於io.netty.handler.codec包中。   編解碼框架包含兩部分:Byte流和特定類型數據之間的編解碼,也叫序列化和反序列化。不類型數據之間的轉換。   下圖是編解碼框架的類繼承體系:   其中

原创 netty源碼解析(4.0)-12 Channel NIO實現:channel初始化

創建一個channel實例,並把它register到eventLoopGroup中之後,這個channel然後處於inactive狀態,仍然是不可用的。只有在bind或connect方法調用成功之後才能正常。因此bind或connect算

原创 netty源碼解析(4.0)-24 ByteBuf基於內存池的內存管理

 io.netty.buffer.PooledByteBuf<T>使用內存池中的一塊內存作爲自己的數據內存,這個塊內存是PoolChunk<T>的一部分。PooledByteBuf<T>是一個抽象類型,它有4個派生類: PooledHea

原创 netty源碼解析(4.0)-22 ByteBuf的I/O

    ByteBuf的I/O主要解決的問題有兩個: 管理readerIndex和writerIndex。這個在在AbstractByteBuf中解決。 從內存中讀寫數據。ByteBuf的不同實現主要使用兩種內存:堆內存表示爲b

原创 netty源碼解析(4.0)-13 Channel NIO實現: 關閉和清理

Channel提供了3個方法用來實現關閉清理功能:disconnect,close,deregister。本章重點分析這個3個方法的功能的NIO實現。     disconnect實現: 斷開連接   disconnect方法的調用棧如下

原创 netty源碼解析(4.0)-15 Channel NIO實現:寫數據

寫數據是NIO Channel實現的另一個比較複雜的功能。每一個channel都有一個outboundBuffer,這是一個輸出緩衝區。當調用channel的write方法寫數據時,這個數據被一系列ChannelOutboundHandl

原创 netty源碼解析(4.0)-21 ByteBuf的設計原理

    io.netty.buffer包中是netty ByteBuf的實現。ByteBuf是一個二進制緩衝區的抽象接口,它的功能有: 可以隨機訪問、順序訪問。 支持基本數據類型(byte, short, int, long,