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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Beetle在TCP通讯中使用协议分析器和自定义协议对象

發布時間:2024/4/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Beetle在TCP通讯中使用协议分析器和自定义协议对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? 在處理TCP數據的時候我們需要考慮一個粘包的問題,所謂的粘包就是本次接收的數據不一定完整對應對方發送的數據.對方發送的一次數據有可能需要接收多次才能完成,實際要處理的情況要復習一點;為了解決點包問題所以必須要制訂數據分析協議來處理,常用的解決方法有兩種:一種是基于結束符的方式,而另一種則是在消息頭通過一個4字節存儲消息大小.

分包注意細節

雖然制定處理粘包的方法,但這兩種方法在處理上還是要注意幾種情況,以下通過一個圖來表達幾種情況的處理.

其實最主要關心的是就是分隔符或頭描述的內容分別存放在兩次receive的數據中.

實現一個簡單的協議分析器

組件提供以上兩種分包處理方式,基礎類分別是HeadSizeOfPackage和EofDataOfPackage;通過繼續以上兩個類就可以簡單地實現對象協議的發送和接收;如果以上兩者不適合的情況可以從Package派生一個新的協議分析類來滿足實際情況的需要.?接下來通過繼承HeadSizeOfPackage實現一個簡單的對象協議分析器,相關Package實現如下:

public class HeadSizePackage:Beetle.HeadSizeOfPackage{public HeadSizePackage(Beetle.TcpChannel channel) : base(channel) { }private static Dictionary<string, Smark.Core.InstanceHandler> mTypes = new Dictionary<string, Smark.Core.InstanceHandler>(256);public static void LoadAssembly(System.Reflection.Assembly assembly){foreach (Type type in assembly.GetTypes()){if (type.GetInterface("Beetle.IMessage") != null && type.IsClass){mTypes[type.Name] = new Smark.Core.InstanceHandler(type);}}}protected override Beetle.IMessage ReadMessageByType(Beetle.BufferReader reader, out object typeTag){typeTag = reader.ReadShortString();Smark.Core.InstanceHandler handler;if (mTypes.TryGetValue((string)typeTag, out handler)){return (Beetle.IMessage)handler.Instance();}return null;}protected override void WriteMessageType(Beetle.IMessage msg, Beetle.BufferWriter writer){ writer.WriteShortString(msg.GetType().Name);}}

繼承HeadSizeOfPackage后主要重寫兩個方法,分別是ReadMessageByType從BufferReader中讀取對消息名稱并返回具體的消息對象,WriteMessageType則是寫入消息名稱.兩個方法的主要作用是寫入消息類型標記和根據標記返回消息對象.制定完成協議分析后要做的事情就是制定對象協議,以下是一個簡單注冊協議實現:

class Register : Beetle.IMessage{public string Name;public string EMail;public DateTime ResponseTime;public void Load(Beetle.BufferReader reader){Name = reader.ReadString();EMail = reader.ReadString();ResponseTime = reader.ReadDate();}public void Save(Beetle.BufferWriter writer){writer.Write(Name);writer.Write(EMail);writer.Write(ResponseTime);}}

構建對象協義的TCP服務端

?在Beetle中構建基于對象協議的TCP服務端也是一件非常簡單的事情,只需要Beetle.ServerBase<T>即可,而泛型參則是具體的協議分析器.

class Program:Beetle.ServerBase<Beetle.Packages.HeadSizePackage>{protected override void OnConnected(object sender, Beetle.ChannelEventArgs e){base.OnConnected(sender, e);Console.WriteLine("{0} connected", e.Channel.EndPoint);}protected override void OnDisposed(object sender, Beetle.ChannelDisposedEventArgs e){base.OnDisposed(sender, e);Console.WriteLine("{0} disposed", e.Channel.EndPoint);}protected override void OnError(object sender, Beetle.ChannelErrorEventArgs e){base.OnError(sender, e);Console.WriteLine("{0} error {1}", e.Channel.EndPoint,e.Exception.Message);}protected override void OnMessageReceive(Beetle.PacketRecieveMessagerArgs e){Register reg = (Register)e.Message;reg.ResponseTime = DateTime.Now;Console.WriteLine("Name:{0} EMail:{1}", reg.Name, reg.EMail);e.Channel.Send(reg);}

和構建普通TCP服務一樣,重寫相關處理過程方法即可,不過其中一個方法有所不同就是OnMessageReceive,該對象主要包括接收的消息和對應的Socket通道TcpChannel.在之前只定義了一個Register對象消息,在這里就獲取相關消息并把ResponseTime設置成當前時間后發還給對應的客戶端.

構建客戶端進行消息交互

客戶端的創建則使用TcpServer.CreateClient<T>方法來構建,泛型參是對應協議分析器,具體代碼如下:

channel = Beetle.TcpServer.CreateClient<Beetle.Packages.HeadSizePackage>(txtIPAddress.Text, 9450,OnReceive);channel.ChannelDisposed += OnDisposed;channel.ChannelError += OnError;channel.BeginReceive(); private void OnReceive(Beetle.PacketRecieveMessagerArgs e){Register reg = (Register)e.Message;Invoke(new Action<Register>(r => {txtREMail.Text = r.EMail;txtRName.Text = r.Name;txtResponseTime.Text = r.ResponseTime.ToString();}), reg);}private void OnDisposed(object sender, Beetle.ChannelEventArgs e){Invoke(new Action<Beetle.ChannelEventArgs>(s => {txtStatus.Text = "disconnect!";}), e);}private void OnError(object sender, Beetle.ChannelErrorEventArgs e){Invoke(new Action<Beetle.ChannelErrorEventArgs>(r => {txtStatus.Text = r.Exception.Message;}), e);}

構建連接后綁事相關事件,并進入數據接收模式即可.創建連接完成后就可以進行對象協議發送

Register reg = new Register();reg.Name = txtName.Text;reg.EMail = txtEMail.Text;channel.Send(reg);

運行效果

?

下載代碼:Code

總結

通過Beetle的協議分析器可以簡單地解決TCP粘包問題的同時還可以很靈活地支持不同的協議,在后面的章節里會講述一下如何擴展一個消息配適器實處理.net二制序充列,XML序列化,prorobuf,amf3等數據對象.

總結

以上是生活随笔為你收集整理的Beetle在TCP通讯中使用协议分析器和自定义协议对象的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 久草福利资源在线观看 | 久久久国产精品一区二区三区 | 韩国中文字幕在线观看 | 欧美日韩一区在线观看 | 成人无码久久久久毛片 | 黄色片在线播放 | 人妻无码一区二区三区免费 | 国内视频一区二区 | 欧美精彩视频 | 欧美人妖老妇 | 中文在线天堂网 | 日韩二区三区四区 | 久久精品久久久精品美女 | 中文字幕在线1 | 熟妇毛片 | 亚洲精品女人久久久 | 欧美性生活一级 | 国产一级免费大片 | 91看毛片 | 亚洲中文字幕97久久精品少妇 | 亚洲综合国产精品 | 加勒比一区二区三区 | 不卡视频一区二区三区 | 一本大道东京热无码 | 黑人超碰 | 奶罩不戴乳罩邻居hd播放 | www.国产麻豆| 毛片毛片毛片毛片毛片毛片毛片毛片 | 免费观看成人av | 91精品国产一区二区三区蜜臀 | 精品日本一区二区三区在线观看 | 久伊人 | 自拍偷拍亚洲区 | 久久福利视频导航 | 都市激情自拍 | 天天添| 久久久精品一区二区三区 | 亚洲图片欧美激情 | 国产探花一区二区 | 欧美性高潮 | 国产99久| 亚洲羞羞 | 国产精品久久久久久久一区探花 | 国产精品一级 | 国产激情久久久久久熟女老人av | 国产精品美女高潮无套 | 日韩资源网 | 毛片免费全部无码播放 | 视频在线观看99 | 性色国产成人久久久精品 | 69式视频 | 伊人久久网站 | 黑人一级视频 | 欧美一区二区三区久久成人精品 | 精品日本一区二区三区在线观看 | 一区二区三区视频免费在线观看 | 成人性爱视频在线观看 | 久久久久无码国产精品一区李宗瑞 | 国产高清视频免费 | 欧美性一区二区三区 | 男女视频在线观看免费 | 亚洲中文字幕第一区 | 精品少妇人妻av免费久久久 | 四虎影院永久 | 国模无码国产精品视频 | 日本打白嫩屁股视频 | 成人免费观看视频网站 | 精品一区二区久久久 | 国产又爽又猛又粗的视频a片 | 久久精品国产亚洲AV黑人 | 天天草天天爽 | 国产精品久久久久久69 | 国产欧美日韩在线播放 | 国产精品麻豆成人av电影艾秋 | 蜜桃网av | 国产精品天天狠天天看 | 欧美视频免费在线观看 | 一级a毛片免费观看久久精品 | 无码成人一区二区 | 五号特工组之偷天换月 | a级片在线观看视频 | 国产91久久婷婷一区二区 | bt天堂av| 99在线视频观看 | 久久久久亚洲av成人片 | 国产精在线 | 天堂资源中文在线 | 97射射| 欧美成人精品一区二区免费看片 | 欧美寡妇性猛交 | 亚洲一区二区三区成人 | 国产精品午夜福利视频234区 | 日韩在线第三页 | 人人爽人人爽人人爽人人爽 | 性av网 | 亚洲精品粉嫩小泬20p | 国产在线视频一区 | 91丝袜视频| 国产日韩精品在线观看 |