1、客户端与服务端需要交换数据:
socket API编程
两台机器通信:操作系统平台不同、网络字节序的转换、字节序对齐不同、服务开发语言不同
上述4种情况都需要对数据进行编解码操作
报文:数据
2、面向对象设计
类的UML画法
1、继承:使用带空心箭头的实线,箭头指向父类
父类:public protected private
子类:public protected private
public继承:public:类外可以访问 protected:类内访问 private:基类自己类内访问
protected继承:protected protected private
private继承:都不可以访问
如果没有继承,类内部没有限制,可以相互访问,外部只有public可以访问
如果有继承,private继承,子类成员不可以访问;protected继承,protected成员子类可以访问
含虚函数的类不能实例化,只有全部实现虚函数才可以实例化
抽象类用斜体表示
单向关联关系:单项实线箭头
双向关联关系:双向实线箭头
自关联关系:指向自己的箭头
聚合关系:整体和部分关系:空心的菱形+箭头:箭头指向成员,菱形指向整体
组合关系:整体和部分关系:整体和部分具有同生共死,不能单独存在:带实行菱形的箭头
依赖关系:带箭头的虚线表示,由依赖的一方指向被依赖的一方:类的成员函数用到某个类的对象
3、常见的几种编解码方式
- XML类似于html:允许自己定义标签
- Json
- Protocol Buffer
- ASN.1抽象语法标记
- boost 序列化的类
- 自定义的格式
4、ASN.1:描述一种对数据进行表示、编码和解码的数据格式
- 一部分描述信息内数据,数据类型及序列格式:相当于属性
- 一部分描述如何将各部分组成消息:相当于方法
标准编码规则:
- 基本编码规则(BER)
- 规范编码规则(CER)
- 唯一编码规则(DER)
- 压缩编码规则(PER)
- XML编码规则(XER)
编码格式(TLV)
tag(type) length value
每个数据打包成一个TLV结构体,组成链表,然后总的再组成一个TLV结构体
5、将C源函数封装成类原则
- 将宏定义------->const 常量:主要是整形和字符串,一些连续的整型值可以改写成枚举值
- 宏函数:简单的宏函数可以改写成内联函数,如果比较复杂可以改写成类的成员函数
- 若成员函数都用到了某个变量,可以将这个变量设置成类的成员变量
- 通过类的访问控制权限控制类的某些成员可以外部访问:一般设置成public
多态:
- 有继承关系
- 父类成员函数声明为virtual的,且子类重写父类的成员函数
- 有父类的指针或引用指向子类的对象,通过父类指针调用子类对象的方法
含有纯虚函数的类称之为抽象类,它不能生成对象即创建实列,只能创建它的派生类的实例。
抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。
如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。
如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。
————————————————
版权声明:本文为CSDN博主「Amoricc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44244332/article/details/123507232
ASN.1类图
简单工厂模式:
工厂:使用一个单独的类来创建实例的工程,通过参数来创建不同的对象
简单工厂:把对象的创建放到一个工厂类,通过参数来创建不同的对象
特点:
缺点:每次添加一个对象,就需要对简单工厂进行修改
优点:去除了与具体产品的依赖
自己的理解:创建一个总的工厂,然后根据需求创建不同的特例子工厂类,在实例化时用父指针指向子类对象(即自己特例化的子类),然后调用子类的创建函数,即是上图的最后一块,这个时候再增加新的类,只需要增加子类就行了,不必增加原来的工厂类代码,牛!
使用步骤:
- 创建一个工厂类对象,父类指针指向子类工厂对象
- 使用父类指针这项子类对象的createcodec函数创建对象
- 由第二步创建处理的对象由其父类指针指向
- 调用子类编解码成员函数
7、单向散列函数
输入:消息-------->输出:散列值
特点:
- 压缩性:任意长度的数据,算出的值是固定的
- 容易计算
- 抗修改性
- 强抗碰撞性
- 单向性(不可逆)
8、日志:日志级别越高,打印日志越少