定义参考IOCPNet网络库开发; 因为这俩项目,是对应dll程序集,服务器端,和unity客户端,都会使用到; 需要先检查一下,IOCP对应的Protocol协议类,核心net逻辑,对应的输出路径,不是一个空路径; 右键其一,另一同理;

打开unity客户端,之前已经生成,所在位置

可Serializable序列化,IOCP通信协议,抽象基类

与之对应的,继承,协议类NetMsg,只有一个string字符,用作测试

IOCP通信核心net逻辑中,通用工具类,PackLenInfo接口,是打包网络消息包体的具体逻辑; 其中IOCP还是通过tcp网络协议,进行通信的,所以头部长度的还是4即可,完成消息包pkg的构建;

接受到消息后,SplitLogicBytes函数接口,是用来解析包体的,消息包的头部长度4索引之后,调用Buffer.BlockCopy完成,字节块的复制; 然后再对,通过ref关键字,传递进来的bytesLst数据容器,进行RemoveRange对应索引的数据移除清理,参考out和ref之间的区别

序列化、解序列化,对应的Serialize、DeSerialize函数接口

枚举对应的是,不同的log打印颜色

对应打印颜色的ConsoleLog打印函数接口

继续,none的话,调用原生Console.WriteLine即可

几种log的Action回调,普通Log,颜色ColorLog

警告Warn打印,对应yellow黄色,错误Error打印,对应Red红色

连接对话Token,服务器和客户端,有一个共同的基类,先弄一个TokenState枚举,标识连接的状态

基类的具体逻辑,声明一个int整型tokenID、还有俩SocketAsyncEventArgs异步连接,rcvSAEA表示接受消息,sndSAEA表示发送消息; skt变量,表示一个基础的Socket网络连接,可能是客户端,也可能是服务器; readLst字节byte的List数据容器,是用来存储,接受读取数据; cacheQue缓存字节数组Queue队列容器,是用来发送消息的,有可能存着多条消息等待发送,就需要先缓存; 构造函数中,完成,收发消息的异步连接初始化,它们的Complete完成回调,加上都是IO_Completed这个函数接口,然后设置一下,rcvSAEA接收连接的数据容器大小是2048;

完成回调IO_Completed的具体逻辑,是通过switch和case机制,根据SocketAsyncOperation这个,套接字的操作类型判断,是调用ProcessRcv接收消息函数,还是ProcessSend发送消息函数,后续会解析这俩的具体逻辑

对应的上层IOCPNet网络逻辑,也包含一个IO_Completed函数接口; 它是通过switch,异步连接的LastOperation属性,调用不同的函数; 打断点可知,开启服务器端后,再开启客户端,服务器的属性是Accept对应的逻辑,客户端的属性是Connect逻辑;

关闭Token连接的,是CloseToken函数接口,修改TokenState枚举状态,调用onTokenClose关闭函数回调,清空各数据容器,调用socket网络连接skt的,内置Shutdown和Close函数即可

Token中,有三个抽象函数,分别是:连接、接受消息、断连

客户端的Token,重写这仨

服务器的Token,同理

回到Token基类IOCPToken,ProcessByteLst函数接口,是用来接收、解码消息; 调用的是,工具类的SplitLogicBytes函数接口,从读取信息容器readLst中拿到字节数组buff; 再调用工具类的DeSerialize函数接口,解序列化,然后调用OnReceiveMsg,打印,接收到信息,最后再递归调用自身;

它的上层调用,是ProcessRcv函数接口,通过SocketAsyncEventArgs.BytesTransferred 属性判断,接收的字节是否大于0,完成读取信息的数据容器readLst填充,调用ProcessByteLst接收、解码消息; 最后调用的StartAsyncRcv,实际上是通过Socket.ReceiveAsync判断,负责接收消息的,SocketAsyncEventArgs异步连接rcvSAEA,是否已完成功能; 如果ReceiveAsync返回值为false,就递归调用ProcessRcv函数自身,继续接收消息;