一個ServiceGB809包含Master和Slaver,實現絕大部分業務數據包邏輯(比如:Except Login())。
Master為MasterLink;
Slaver為SlaverChannel;
SlaverChannel由多個SlaverLink構成(由LinksCollection來管理數量以及策略)
由於通訊包相同,構建TcpOperator類,作為兩種Link的通用成員;
整體過程使用Reader和Writer的流操作模式;
自行通過線程管理異步讀取;
通訊包各個內部成員類(如Head、Version等)實現到buffer的writer操作過程,因此Writer不再單獨實現,非基礎類型往往繼承至BufferedEntityBase;
TcpOperator內部通過PackageReader類成員實現讀取,以及通過通訊包Buffer實現寫入;
需要通過Open和Close調用的類繼承至ServiceBase;
業務及配置使用慣例。
代碼僅曾運行測試過登錄,包解析尚未完成。
(不必質疑為什么不用快速連接方式,此根據809一些常態化參數以及非大規模連接並發,此碼為業余熟悉809所寫,不涉及公司任何商業信息)
未對接收進行任何處理,已通過sokit測試驗證。
此代碼主要展示說明一下809的設計以及一些童鞋凌亂的buffer應該怎么做得簡潔。
但涉及緩沖到結構的,可依照:
public abstract class BufferedEntityBase:IBuffer, IBuffered { protected BufferedEntityBase(params object[] properties) { InitializeProperties(properties); ToBuffer(); } protected BufferedEntityBase(byte[] buffer) { Buffer = buffer; InitializePropertiesFromBuffer(); } protected abstract void InitializeProperties(params object[] properties); protected abstract void OnInitializePropertiesFromReadBuffer(BinaryReader reader); protected virtual void InitializePropertiesFromBuffer() { using (var stream = new MemoryStream(Buffer)) { var reader = new BinaryReader(stream); OnInitializePropertiesFromReadBuffer(reader); stream.Close(); } } protected abstract void OnWriteToBuffer(BinaryWriter writer); public virtual byte[] ToBuffer() { using (var stream = new MemoryStream()) { var writer = new BinaryWriter(stream); OnWriteToBuffer(writer); var reader = new BinaryReader(stream); stream.Seek(0, SeekOrigin.Begin); Buffer = reader.ReadBytes((int)stream.Length);//stream.GetBuffer(); stream.Close(); } return Buffer; } public byte[] Buffer { get; protected set; } }
for example(809頭):
1 public class Header : BufferedEntityBase 2 { 3 public static uint CounterOnSendGenerater { get; private set; } 4 public static uint CounterOnRecieveGenerater { get; private set; } 5 public const int HeaderFixedByteLength = 22; 6 public uint Length { get;private set; } 7 public uint Number { get; private set; } 8 public PackageCatelog Catelog { get; private set; } 9 public uint SessionId { get; private set; } 10 public Version Version { get; private set; } 11 public EncryptOpitions EncryptOpition { get; private set; } 12 public uint KeyForCommonEncript { get; private set; } 13 public Header(byte[] buffer) : base(buffer) { CounterOnRecieveGenerater++;} 14 public Header(uint length, uint number, PackageCatelog catelog) 15 :base(length,number, catelog,Config.Value.ServiceGB809Info.MasterLinkInfo.SessionId,Config.Version,Config.Value.ServiceGB809Info.MasterLinkInfo.EncryptFlag, Config.Value.ServiceGB809Info.MasterLinkInfo.EncryptKey) 16 { CounterOnSendGenerater++;} 17 public Header(uint length, PackageCatelog catelog): this(length, CounterOnSendGenerater, catelog){} 18 protected override void InitializeProperties(params object[] properties) 19 { 20 Length = (uint)properties[0] + Package.NotDataLength; 21 Number = (uint)properties[1]; 22 Catelog = (PackageCatelog)properties[2]; 23 SessionId = (uint)properties[3]; 24 Version = properties[4] as Version; 25 EncryptOpition = (EncryptOpitions)properties[5]; 26 KeyForCommonEncript = (uint)properties[6]; 27 } 28 protected override void OnInitializePropertiesFromReadBuffer(BinaryReader reader) 29 { 30 Length = reader.ReadUInt32Big(); 31 Number = reader.ReadUInt32Big(); 32 Catelog = (PackageCatelog)reader.ReadUInt16Big(); 33 SessionId = reader.ReadUInt32Big(); 34 Version = new Version(reader.ReadByte(),reader.ReadByte(),reader.ReadByte()); 35 EncryptOpition = (EncryptOpitions)reader.ReadByte(); 36 KeyForCommonEncript = reader.ReadUInt32Big(); 37 } 38 protected override void OnWriteToBuffer(BinaryWriter writer) 39 { 40 writer.WriterBig(Length); 41 writer.WriterBig(Number); 42 writer.WriterBig((ushort)Catelog); 43 writer.WriterBig(SessionId); 44 writer.WriterBig(Version.Buffer); 45 writer.WriterBig((byte)EncryptOpition); 46 writer.WriterBig(KeyForCommonEncript); 47 } 48 }
2016-01
更新添加了部分子包內容——也由此在BodyBase分化了BodyEmbedChildBase。
謾罵語:
有一些可取之處,更多的是復雜的文檔和設計~~,只需規定一些特定流程(這個文檔已有),其他業務太繁瑣——只需提供類說明(可保留保投保為和頭),包體統一使用現成的Protobuff即可(如果你願意,接入者業務類都不用寫了不是),也不閑寫到累;更是累接入者!