obsidian/笔记文件/2.笔记/Protobuf序列化_第一章.md

123 lines
4.8 KiB
Markdown
Raw Permalink Normal View History

2025-03-26 00:02:56 +08:00
定义参考[[Protobuf通信协议]]即可;
如果要使用Protobuf通信协议需要先用到对应的程序集
在微软的官方NuGet软件包平台就可以下载使用
右键,测试工程
![[Pasted image 20240418133310.png]]
可以看到是有下载和安装了对应的软件包也隐式安装了与之对应的Core核心库
![[Pasted image 20240418133327.png]]
unity客户端同理也是集成了对应的软件包dll程序集
![[Pasted image 20240418133414.png]]
测试工程先弄一个Person协议类需要加上ProtoContract标签其中也会加上ProtoMember和tag数字索引标识协议包含的数据
![[Pasted image 20240418133456.png]]
再弄一个Address地址相关的协议类也是加上ProtoContract和ProtoMember标签而且嵌套在Person协议类里
不管是哪个协议类都需要加上Serializable标签标识可序列化
![[Pasted image 20240418133653.png]]
使用原生的Serialize序列化接口对Person协议类进行序列化
![[Pasted image 20240418133955.png]]
与之对应的,原生,解序列化函数接口
![[Pasted image 20240418134054.png]]
调用原生序列化、解序列化的TestBasicNormal函数接口完成Person和Address协议类的构建后序列化person到data字节数组再直接DeSerialize解序列化变回Person打印其中的字段
![[Pasted image 20240418142236.png]]
Main函数调用运行log正常
![[Pasted image 20240418142433.png]]
![[Pasted image 20240418142444.png]]
![[Pasted image 20240418142506.png]]
TestBasicPB函数接口是用来测试Protobuf的最开始也是完成Person和Address协议类的构建然后调用Protobuf内部的Serializer逻辑对应的Serialize序列化、Deserialize解序列化接口
然后也是打印log信息
![[Pasted image 20240418142640.png]]
![[Pasted image 20240418142848.png]]
继续测试创建一个person.bytes字节文件序列化写入然后解序列化读取打印log
![[Pasted image 20240418142924.png]]
主函数调用打印log正常
![[Pasted image 20240418143009.png]]
![[Pasted image 20240418143035.png]]
测试使用的是UDP网络通信与之对应的协议类其中CMD枚举是用于通信的Head头部标识包含 LogicLogin登录相关、BagInfo背包相关
还有一个Error枚举是用于错误码的逻辑处理
![[Pasted image 20240418150003.png]]
背包协议对应的ReqBagInfo请求、RspBagInfo接收其中背包结构BagItem
![[Pasted image 20240418153401.png]]
登录协议ReqLogicLogin请求有acct账号、pass密码结构RspLogicLogin接收对应UserData用户数据结构为uid、name名字、level等级、exp经验
![[Pasted image 20240418153545.png]]
还有俩测试连接的请求接收分别是ReqXXXOOO、RspXXXOOO
消息主体是Body结构包含上述解析的协议结构
![[Pasted image 20240418153754.png]]
Head是头部包含CMD协议标识的枚举而Pkg就是头部 + 消息主体,的网络消息包
![[Pasted image 20240418153919.png]]
常规的Serialize序列化、DeSerialize解序列化工具接口
![[Pasted image 20240418154108.png]]
![[Pasted image 20240418154137.png]]
UDP跟TCP不一样的地方其中一点是Socket连接上没有很明确的客户端和服务端的区分
![[Pasted image 20240418155311.png]]
服务端的ReqLogin登录请求响应逻辑打印消息主体Body的acct账号、pass密码信息
然后构建一个Body消息主体再调用服务端根逻辑ServerRoot的SendMsg函数接口完成消息回发
![[Pasted image 20240418155428.png]]
SendMsg函数接口对应的具体逻辑就是构建Pkg消息包使用常规的Serialize序列化工具得到字节数组通过udp发送即可
![[Pasted image 20240418155642.png]]
服务端的背包ReqBagInfo请求响应也是在打印log之后构建背包RspBagInfo回包对应的Body消息主体也是调用SendMsg函数接口发回给客户端即可
![[Pasted image 20240418155752.png]]
服务端逻辑根节点声明了udp端、还有登录login和背包bag对应协议的Handler事件逻辑
弄一个Instance单例
![[Pasted image 20240418160004.png]]
ServerRecive函数接口使用[[await]]异步接收udp网络消息然后调用常规的DeSerialize 解序列化工具;
switch消息包的head头部cmd枚举对应的协议类型调用 登录相关loginHandler 或 背包相关 bagHandler 的响应逻辑即可;
![[Pasted image 20240418160133.png]]
根逻辑点对应的Init初始化就是各个Handler的实例化对象再开一个udp连接使用[[Task]]创建一个ServerRecive接收消息的任务即可
![[Pasted image 20240418160435.png]]
对应的Main主函数调用Init初始化开启服务器
![[Pasted image 20240418160651.png]]