123 lines
4.8 KiB
Markdown
123 lines
4.8 KiB
Markdown
![]() |
定义参考[[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]]
|