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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

内置的常用协议实现模版

發(fā)布時間:2023/11/29 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内置的常用协议实现模版 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
SuperSocket

內(nèi)置的常用協(xié)議實現(xiàn)模版

中文(中國)Toggle Dropdown ? v1.6Toggle Dropdown

關鍵字: TerminatorReceiveFilter, CountSpliterReceiveFilter, FixedSizeReceiveFilter, BeginEndMarkReceiveFilter, FixedHeaderReceiveFilter

閱讀了前面一篇文檔之后, 你可能會覺得用 SuperSocket 來實現(xiàn)你的自定義協(xié)議并不簡單。 為了讓這件事變得更容易一些, SuperSocket 提供了一些通用的協(xié)議解析工具, 你可以用他們簡單而且快速的實現(xiàn)你自己的通信協(xié)議:

  • TerminatorReceiveFilter?(SuperSocket.SocketBase.Protocol.TerminatorReceiveFilter, SuperSocket.SocketBase)
  • CountSpliterReceiveFilter?(SuperSocket.Facility.Protocol.CountSpliterReceiveFilter, SuperSocket.Facility)
  • FixedSizeReceiveFilter?(SuperSocket.Facility.Protocol.FixedSizeReceiveFilter, SuperSocket.Facility)
  • BeginEndMarkReceiveFilter?(SuperSocket.Facility.Protocol.BeginEndMarkReceiveFilter, SuperSocket.Facility)
  • FixedHeaderReceiveFilter?(SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter, SuperSocket.Facility)

TerminatorReceiveFilter - 結束符協(xié)議

與命令行協(xié)議類似,一些協(xié)議用結束符來確定一個請求.

例如, 一個協(xié)議使用兩個字符 "##" 作為結束符, 于是你可以使用類 "TerminatorReceiveFilterFactory":

/// <summary> /// TerminatorProtocolServer /// Each request end with the terminator "##" /// ECHO Your message## /// </summary> public class TerminatorProtocolServer : AppServer {public TerminatorProtocolServer(): base(new TerminatorReceiveFilterFactory("##")){} }

默認的請求類型是 StringRequestInfo, 你也可以創(chuàng)建自己的請求類型, 不過這樣需要你做一點額外的工作:

基于TerminatorReceiveFilter實現(xiàn)你的接收過濾器(ReceiveFilter):

public class YourReceiveFilter : TerminatorReceiveFilter<YourRequestInfo> {//More code }

實現(xiàn)你的接收過濾器工廠(ReceiveFilterFactory)用于創(chuàng)建接受過濾器實例:

public class YourReceiveFilterFactory : IReceiveFilterFactory<YourRequestInfo> {//More code }

然后在你的 AppServer 中使用這個接收過濾器工廠(ReceiveFilterFactory).

CountSpliterReceiveFilter - 固定數(shù)量分隔符協(xié)議

有些協(xié)議定義了像這樣格式的請求 "#part1#part2#part3#part4#part5#part6#part7#". 每個請求有7個由 '#' 分隔的部分. 這種協(xié)議的實現(xiàn)非常簡單:

/// <summary> /// Your protocol likes like the format below: /// #part1#part2#part3#part4#part5#part6#part7# /// </summary> public class CountSpliterAppServer : AppServer {public CountSpliterAppServer(): base(new CountSpliterReceiveFilterFactory((byte)'#', 8)) // 7 parts but 8 separators{} }

你也可以使用下面的類更深入的定制這種協(xié)議:

CountSpliterReceiveFilter<TRequestInfo> CountSpliterReceiveFilterFactory<TReceiveFilter> CountSpliterReceiveFilterFactory<TReceiveFilter, TRequestInfo>

FixedSizeReceiveFilter - 固定請求大小的協(xié)議

在這種協(xié)議之中, 所有請求的大小都是相同的。如果你的每個請求都是有9個字符組成的字符串,如"KILL BILL", 你應該做的事就是想如下代碼這樣實現(xiàn)一個接收過濾器(ReceiveFilter):

class MyReceiveFilter : FixedSizeReceiveFilter<StringRequestInfo> {public MyReceiveFilter(): base(9) //傳入固定的請求大小{}protected override StringRequestInfo ProcessMatchedRequest(byte[] buffer, int offset, int length, bool toBeCopied){//TODO: 通過解析到的數(shù)據(jù)來構造請求實例,并返回} }

然后在你的 AppServer 類中使用這個接受過濾器 (ReceiveFilter):

public class MyAppServer : AppServer {public MyAppServer(): base(new DefaultReceiveFilterFactory<MyReceiveFilter, StringRequestInfo>()) //使用默認的接受過濾器工廠 (DefaultReceiveFilterFactory){} }

BeginEndMarkReceiveFilter - 帶起止符的協(xié)議

在這類協(xié)議的每個請求之中 都有固定的開始和結束標記。例如, 我有個協(xié)議,它的所有消息都遵循這種格式 "!xxxxxxxxxxxxxx$"。因此,在這種情況下, "!" 是開始標記, "$" 是結束標記,于是你的接受過濾器可以定義成這樣:

class MyReceiveFilter : BeginEndMarkReceiveFilter<StringRequestInfo> {//開始和結束標記也可以是兩個或兩個以上的字節(jié)private readonly static byte[] BeginMark = new byte[] { (byte)'!' };private readonly static byte[] EndMark = new byte[] { (byte)'$' };public MyReceiveFilter(): base(BeginMark, EndMark) //傳入開始標記和結束標記{}protected override StringRequestInfo ProcessMatchedRequest(byte[] readBuffer, int offset, int length){//TODO: 通過解析到的數(shù)據(jù)來構造請求實例,并返回} }

然后在你的 AppServer 類中使用這個接受過濾器 (ReceiveFilter):

public class MyAppServer : AppServer {public MyAppServer(): base(new DefaultReceiveFilterFactory<MyReceiveFilter, StringRequestInfo>()) //使用默認的接受過濾器工廠 (DefaultReceiveFilterFactory){} }

FixedHeaderReceiveFilter - 頭部格式固定并且包含內(nèi)容長度的協(xié)議

這種協(xié)議將一個請求定義為兩大部分, 第一部分定義了包含第二部分長度等等基礎信息. 我們通常稱第一部分為頭部.

例如, 我們有一個這樣的協(xié)議: 頭部包含 6 個字節(jié), 前 4 個字節(jié)用于存儲請求的名字, 后兩個字節(jié)用于代表請求體的長度:

/// +-------+---+-------------------------------+ /// |request| l | | /// | name | e | request body | /// | (4) | n | | /// | |(2)| | /// +-------+---+-------------------------------+

使用 SuperSocket, 你可以非常方便的實現(xiàn)這種協(xié)議:

class MyReceiveFilter : FixedHeaderReceiveFilter<BinaryRequestInfo> {public MyReceiveFilter(): base(6){}protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length){return (int)header[offset + 4] * 256 + (int)header[offset + 5];}protected override BinaryRequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length){return new BinaryRequestInfo(Encoding.UTF8.GetString(header.Array, header.Offset, 4), bodyBuffer.CloneRange(offset, length));} }

你需要基于類FixedHeaderReceiveFilter實現(xiàn)你自己的接收過濾器.

  • 傳入父類構造函數(shù)的 6 表示頭部的長度;
  • 方法"GetBodyLengthFromHeader(...)" 應該根據(jù)接收到的頭部返回請求體的長度;
  • 方法 ResolveRequestInfo(....)" 應該根據(jù)你接收到的請求頭部和請求體返回你的請求類型的實例.

然后你就可以使用接收或者自己定義的接收過濾器工廠來在 SuperSocket 中啟用該協(xié)議.

  • Prev: 內(nèi)置的命令行協(xié)議
  • Next: 使用 IRequestInfo 和 IReceiveFilter 等等其他對象來實現(xiàn)自定義協(xié)議

? 2018 - GetDocs.Net -?Hosted by BuyVM

轉(zhuǎn)載于:https://www.cnblogs.com/liuslayer/p/8624336.html

總結

以上是生活随笔為你收集整理的内置的常用协议实现模版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。