DotNetty 學習


【轉載】http://www.cnblogs.com/littlegod/p/7699482.html

DotNetty的學習是帶着如下這些問題展開:

1. Socket基礎框架方案:

    通信模式:異步非阻塞

    DotNetty采用 ServerBootstrap對象引導Socket服務器啟動,通過設置工作組線程(group),設置通道模式(Channel<TcpServerSocketChannel>),設置網絡參數(Option),設置主線程處理程序(Handler),設置子線程處理程序(ChildHandler)等來完成。

   每一個創建的socket對象被映射成IChannel對象,其管理則是通過 IChannelPipeline管道來統一處理其生命周期,管道通過AddLast 方法注冊各類 Handler處理程序, 這些Handler處理程序被划分為 消息入站和消息出站兩種類型,為完成需要的功能,需要重寫框架設計好的事件處理方法, 常用的包括 IChannel的注冊,激活,讀取,寫入,釋放等等。

2.粘包拆包的實現

  DotNetty對通信的粘包拆包是由消息入站和消息出戰的Handler處理程序, 入站的Handler 解析傳入消息的包頭,包長度等,出站則要對消息添加包頭和長度等信息,這兩個Handler處理程序分別是:LengthFieldPrepender  ,LengthFieldBasedFrameDecoder

3.心跳包實現

   管道中加入IdleStateHandler來處理超時時間,消息處理Handler則需要重寫 userEventTriggered 處理超時。

4. Channel管道機制解決代碼復用問題

    消息可以從任何Handler點發起,如果沒有明確具體的Handler,則整個管道都會走一遍,比如 通過context執行寫入,那么消息則會被從當前Handler處傳遞到下一個Handler; 如果使用IChannel對象來寫入,則不確定是在哪個Handler上,消息則會在整個管道走一遍。

5. IChannel對象和Context對象復用問題

   context對象包含了對Ichannel對象的引用, Ichannel對象通過獲取當前管道對象可以獲取當前context對象。 二者都可以緩存並后續使用。

6.DotNetty對KeepAlive的處理

   在引導程序的設置中,可以設置ChannelOption,開啟KeepAlive, 但是框架也僅僅實在這一層面做了處理,如果想要對keepalive的空閑時間等更精細化設置,框架還不支持,從這點上應該看出DotNetty不推薦使用KeepAlive來維持連接。

 

--------------------------------------------------------------------------------------------------

1:關於Channel:

SocketDatagramChannel:針對UDP的管道實現

TcpServerSocketChannel:針對TCP服務端的管道實現

TcpSocketChannel:針對TCP客戶端的管道實現

 

2:關於編解碼器:

Echo.Server中關於編碼和解碼器的代碼如下:

復制代碼
bootstrap
.Option(ChannelOption.SoBacklog, 10000) .Handler(new LoggingHandler("SRV-LSTN")) .ChildHandler(new ActionChannelInitializer<IChannel>(channel => { IChannelPipeline pipeline = channel.Pipeline; if (tlsCertificate != null) { pipeline.AddLast("tls", TlsHandler.Server(tlsCertificate)); } pipeline.AddLast(new LoggingHandler("SRV-CONN")); pipeline.AddLast("編碼器", new LengthFieldPrepender(2)); pipeline.AddLast("解碼器", new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2)); pipeline.AddLast("echo", new EchoServerHandler()); }));
復制代碼
LengthFieldPrepender為什么是編碼器,LengthFieldBasedFrameDecoder為什么是解碼器,我們來看相關的代碼實現:
public class LengthFieldPrepender : MessageToMessageEncoder<IByteBuffer>
public class LengthFieldBasedFrameDecoder : ByteToMessageDecoder
也就是說,LengthFieldPrepender類就是對應了編碼操作,而LengthFieldBasedFrameDecoder類就是對應了解碼操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM