117 lines
5.0 KiB
Markdown
117 lines
5.0 KiB
Markdown
定义参考[[IOCPNet网络库开发]];
|
||
因为这俩项目,是对应dll程序集,服务器端,和unity客户端,都会使用到;
|
||
需要先检查一下,IOCP对应的Protocol协议类,核心net逻辑,对应的输出路径,不是一个空路径;
|
||
右键其一,另一同理;
|
||
|
||
![[Pasted image 20240417164308.png]]
|
||
|
||
![[Pasted image 20240417165004.png]]
|
||
|
||
![[Pasted image 20240417164942.png]]
|
||
|
||
打开unity客户端,之前已经生成,所在位置
|
||
|
||
![[Pasted image 20240417165053.png]]
|
||
|
||
可Serializable序列化,IOCP通信协议,抽象基类
|
||
|
||
![[Pasted image 20240417165146.png]]
|
||
|
||
与之对应的,继承,协议类NetMsg,只有一个string字符,用作测试
|
||
|
||
![[Pasted image 20240417165212.png]]
|
||
|
||
IOCP通信核心net逻辑中,通用工具类,PackLenInfo接口,是打包网络消息包体的具体逻辑;
|
||
其中IOCP还是通过tcp网络协议,进行通信的,所以头部长度的还是4即可,完成消息包pkg的构建;
|
||
|
||
![[Pasted image 20240417165551.png]]
|
||
|
||
接受到消息后,SplitLogicBytes函数接口,是用来解析包体的,消息包的头部长度4索引之后,调用[[Buffer.BlockCopy]]完成,字节块的复制;
|
||
然后再对,通过ref关键字,传递进来的bytesLst数据容器,进行RemoveRange对应索引的数据移除清理,参考[[out和ref之间的区别]];
|
||
|
||
![[Pasted image 20240417170012.png]]
|
||
|
||
序列化、解序列化,对应的Serialize、DeSerialize函数接口
|
||
|
||
![[Pasted image 20240417170500.png]]
|
||
|
||
枚举对应的是,不同的log打印颜色
|
||
|
||
![[Pasted image 20240417170603.png]]
|
||
|
||
对应打印颜色的ConsoleLog打印函数接口
|
||
|
||
![[Pasted image 20240417170619.png]]
|
||
|
||
继续,none的话,调用原生Console.WriteLine即可
|
||
|
||
![[Pasted image 20240417170647.png]]
|
||
|
||
几种log的Action回调,普通Log,颜色ColorLog
|
||
|
||
![[Pasted image 20240417170724.png]]
|
||
|
||
警告Warn打印,对应yellow黄色,错误Error打印,对应Red红色
|
||
|
||
![[Pasted image 20240417170757.png]]
|
||
|
||
|
||
连接对话Token,服务器和客户端,有一个共同的基类,先弄一个TokenState枚举,标识连接的状态
|
||
|
||
![[Pasted image 20240417171031.png]]
|
||
|
||
基类的具体逻辑,声明一个int整型tokenID、还有俩[[SocketAsyncEventArgs]]异步连接,rcvSAEA表示接受消息,sndSAEA表示发送消息;
|
||
skt变量,表示一个基础的Socket网络连接,可能是客户端,也可能是服务器;
|
||
readLst字节byte的List数据容器,是用来存储,接受读取数据;
|
||
cacheQue缓存字节数组Queue队列容器,是用来发送消息的,有可能存着多条消息等待发送,就需要先缓存;
|
||
构造函数中,完成,收发消息的异步连接初始化,它们的Complete完成回调,加上都是IO_Completed这个函数接口,然后设置一下,rcvSAEA接收连接的数据容器大小是2048;
|
||
|
||
![[Pasted image 20240417171112.png]]
|
||
|
||
完成回调IO_Completed的具体逻辑,是通过switch和case机制,根据SocketAsyncOperation这个,套接字的操作类型判断,是调用ProcessRcv接收消息函数,还是ProcessSend发送消息函数,后续会解析这俩的具体逻辑
|
||
|
||
![[Pasted image 20240418102830.png]]
|
||
|
||
对应的上层IOCPNet网络逻辑,也包含一个IO_Completed函数接口;
|
||
它是通过switch,异步连接的[[LastOperation]]属性,调用不同的函数;
|
||
打断点可知,开启服务器端后,再开启客户端,服务器的属性是Accept对应的逻辑,客户端的属性是Connect逻辑;
|
||
|
||
![[Pasted image 20240417171855.png]]
|
||
|
||
![[Pasted image 20240417172127.png]]
|
||
|
||
![[Pasted image 20240417172159.png]]
|
||
|
||
![[Pasted image 20240417172213.png]]
|
||
|
||
![[Pasted image 20240417172230.png]]
|
||
|
||
关闭Token连接的,是CloseToken函数接口,修改TokenState枚举状态,调用onTokenClose关闭函数回调,清空各数据容器,调用socket网络连接skt的,内置Shutdown和Close函数即可
|
||
|
||
![[Pasted image 20240417173533.png]]
|
||
|
||
Token中,有三个抽象函数,分别是:连接、接受消息、断连
|
||
|
||
![[Pasted image 20240417172607.png]]
|
||
|
||
客户端的Token,重写这仨
|
||
|
||
![[Pasted image 20240417172728.png]]
|
||
|
||
服务器的Token,同理
|
||
|
||
![[Pasted image 20240417172749.png]]
|
||
|
||
回到Token基类IOCPToken,ProcessByteLst函数接口,是用来接收、解码消息;
|
||
调用的是,工具类的SplitLogicBytes函数接口,从读取信息容器readLst中拿到字节数组buff;
|
||
再调用工具类的DeSerialize函数接口,解序列化,然后调用OnReceiveMsg,打印,接收到信息,最后再递归调用自身;
|
||
|
||
![[Pasted image 20240417173036.png]]
|
||
|
||
它的上层调用,是ProcessRcv函数接口,通过[[SocketAsyncEventArgs.BytesTransferred 属性]]判断,接收的字节是否大于0,完成读取信息的数据容器readLst填充,调用ProcessByteLst接收、解码消息;
|
||
最后调用的StartAsyncRcv,实际上是通过[[Socket.ReceiveAsync]]判断,负责接收消息的,[[SocketAsyncEventArgs]]异步连接rcvSAEA,是否已完成功能;
|
||
如果ReceiveAsync返回值为false,就递归调用ProcessRcv函数自身,继续接收消息;
|
||
|
||
![[Pasted image 20240417173326.png]]
|
||
|
||
![[Pasted image 20240417173950.png]] |