歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Netty源碼學習筆記

Netty源碼學習筆記

日期:2017/3/1 9:53:25   编辑:Linux編程

Netty一般都通過bootStrap來啟動, 網絡動作過程就是服務器端bind->accept->read->write,客戶端 connect->read->write,一般bind或者connect後會有多次read、write。依據這種特性netty將bind,accept與read,write的線程分離,connect與read、write線程分離

Netty 的詳細介紹:請點這裡
Netty 的下載地址:請點這裡

一、Netty主要可以分為3部分: buffer, channel, handle。

1、 Channelbuffer

所有的實現類中都提供,readerIndex, writerIndex兩個指針,無需nio buffer的flip.

可以通過ChannelBufferFactory來創建channelbuffer. 分為兩類buffer

HeapChannelBufferFactory: 在jvm堆上創建緩沖區,默認是BIG_ENDIAN排序

DirectChannelBufferFactory:對應nio ByteBuffer.allocateDirect(),直接緩沖區分配

WrappedChannelBuffer實現對ChannelBuffer封裝,通過其可以自定義channelbuffer.

2、 Channel:

通常每種類型的channel一般都有一個對應channelfactory類,以及一個channelconifg類。 通過channelfactory創建channel實例,然後由channelconifg來配置channel屬性。

ChannelGroup: 一組通道的集合,線程安全, 關閉的通道會自動從集合中刪除, 可以通過ChannelGroup廣播消息。

Channel的種類:

LocalChannel、 LocalServerChannel:本地通道、虛擬一個網絡。

DatagramChanneel: udp連接通道.

ServerSocketChannel、SoketChannel: 處理tcp/ip連接的通道。

Channelevent: 用於將:channel的相關信息 如channel本身,傳遞的數據,channel的狀態, future等等一起打包,在調用org.jboss.netty.channel.Channels類的各個靜態的fire方式中產生,然後在channelpipe中的sendUpsteam或sendDownStream中傳遞。

ChannelSink:處理pipeline中downstream結束後的事件。

3、 handler:

所有需要調用的handler都被包裝成ChannelHandlerContext,注冊到channelpipeline的一個map中, 通過兩個指針:head和tail保證map中的handle的調用順序。處理upstream時,通過head指針從前往後依次調用實現ChannelUpstreamHandler接口的handle. downstream處理通過tail指針,從後往前依次調用實現ChannelDownstreamHandler接口的handle。 在downsream的channelpipeline傳送完後,ChannelSink的eventSunk方法完成對系統底層的調用處理。(ChannelSink和channel是通過attach的方式綁定到channelpipeline上)

Netty中已經提供的handler的種類如下:

codec handle。包括 64位機器的編碼、解碼, 字符集轉化,壓縮,http請求編碼、解碼; 序列化對象的編碼、解碼等等。 通過codec handle我們可以直接往channel中寫java 對象。

Timeout handler通過jboss.netty.util.Timer來對讀寫超時或者閒置鏈接的通知,在handle中創建一個time對象,這個time對象包含一個定時器線程Work進程,在handle第一次被觸發時,啟動一個Work線程:監控超時事件。

Stream handler 用於異步處理大數據傳遞。通過將java.io.file對象包裝成ChunkedFile對象,進行傳遞,ChunkedFile的底層實現是RandomAccessFile.

Queue handler: 用戶將接受到的數據或需要發送的數據先存儲到一個queue隊列中,然後一次性的讀和寫。 包括 BlockingReadHandler和BufferedWriteHandler. 注意在BlockingReadHandler將receivemessage存儲入queue後,其後的handler將不再處理 messageReceived,exceptionCaught 和channelClosed事件,因此BlockingReadHandler必須放在channelpipeline的最後。 同理BufferedWriteHandler。

4、 其他

org.jboss.netty.container 各種容器的兼容 Microcontainer OSGi Spring framework 整合接口

Bootstrap 啟動類: BootStrap: TCP服務器端啟動; ClientBootStrap:Tcp client端啟動和ConnectionlessBootstrap UDP啟動。

Copyright © Linux教程網 All Rights Reserved