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