JT/T 809服務(樣例)


Code下載

 

709PDF

一個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即可(如果你願意,接入者業務類都不用寫了不是),也不閑寫到累;更是累接入者!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM