日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

DotNetty 学习

發布時間:2023/12/15 综合教程 38 生活家
生活随笔 收集整理的這篇文章主要介紹了 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類就是對應了解碼操作。

總結

以上是生活随笔為你收集整理的DotNetty 学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。