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來維持連接。
7.未完待續....