初始化连接的是InitSession接口,会被客户端和服务器调用; 初始化一个AsyncPackage数据包pack,调用后续解析的RcvHeadData开始解析,TCP头部数据; try catch之后的finally最终执行的,是之前解析的,OnConnected连接函数;
![[Pasted image 20240415161917.png]]
解析消息体,头部的RcvHeadData接口,通过headIndex索引增加,结束异步读取,返回的int索引,参考[[EndReceive]]; 只要索引小于headLen头部长度,回顾一下,TCP头部长度为4,之前解析过,索引小于这个数值的时候,就递归调用自身RcvHeadData接口,直到索引大于等于4,就调用数据包的,消息主体初始化 InitBodyBuff 函数接口,开始调用,后续解析的RcvBodyData函数,开始解序列化,消息本体;
![[Pasted image 20240415164455.png]]
![[Pasted image 20240415164806.png]]
继续,RcvHeadData接口的catch异常,是打印warn,然后调用,关闭连接的CloseSession接口即可
![[Pasted image 20240415165017.png]]
RcvBodyData函数接口,对应的是,获取消息主体的数据包; 通过bodyIndex索引,判断是否还小于,消息主体的长度bodyLen; 如果还小于,就继续递归调用,自身RcvBodyData函数接口,Receive消息;
![[Pasted image 20240415165141.png]]
大于等于,消息主体长度后的else,就是DeSerialize解序列化后,得到消息msg,传参给OnReceiveMsg函数接口,完成消息的打印; catch异常逻辑,也是打印warn警告信息,和关闭连接即可;
![[Pasted image 20240415165509.png]]
win+r,输入cmd,打开控制台工具
![[Pasted image 20240415171517.png]]
输入,得到当前ip是 192.168.1.3
ipconfig
![[Pasted image 20240415171652.png]]
这是异步网络通信的,核心逻辑,先声明泛型session连接,Socket和连接的客户端List容器sessionLst
![[Pasted image 20240415165724.png]]
结构上,分成俩region,分别对应客户端、服务器相关逻辑
![[Pasted image 20240415165841.png]]
客户端的相关逻辑,其中ServerConnectCB是连接上,前面声明出来的Socket体skt变量; CloseClient就是调用,连接session变量的CloseSession函数接口; StartAsClient函数,就是通过传参ip和port端口,完成skt的初始化构建,BeginConnect异步连接,参考[[AsyncCallback]]即可;
![[Pasted image 20240415165930.png]]
服务器相关的逻辑接口,GetSessionLst函数是用来获取,连接客户端的队列容器; 而CloseServer关闭服务器,就是遍历客户端队列,拿到其中的session连接,调用CloseSession关闭客户端连接即可;
![[Pasted image 20240415170324.png]]
ClientConnectCB接口,是连接客户端的具体逻辑回调; 新建出来的,客户端session连接,会先[[lock]]锁住,确保不被其他线程影响,然后Add加到sessionLst队列容器; 其中传参的closeCB关闭回调,是当连接session关闭的时候,会从sessionLst队列容器Remove移除,并且ColorLog打印黄色信息;
![[Pasted image 20240415170513.png]]
开始服务器的StartAsServer函数接口,也是通过ip和port端口,传参[[AsyncCallback]]上述解析的ClientConnectCB函数接口,完成服务器的Socket构建即可
![[Pasted image 20240415170929.png]]
开始调试,先开服务器
![[Pasted image 20240415171740.png]]
然后,开客户端
![[Pasted image 20240415171821.png]]
对应
![[Pasted image 20240415171844.png]]
![[Pasted image 20240415171856.png]]
输入任意字符,测试,回车
![[Pasted image 20240415171918.png]]
服务器端,正常打印
![[Pasted image 20240415171948.png]]
服务器输入,也会群发,任意输入字符,回车
![[Pasted image 20240415172405.png]]
客户端,回包log正常
![[Pasted image 20240415172437.png]]
先打断点
![[Pasted image 20240415172113.png]]
直接停掉客户端
![[Pasted image 20240415172135.png]]
服务器端,进入这个,获取头部信息的RcvHeadData函数接口,对应的catch异常log,堆栈可见,调用CloseSession关闭连接
![[Pasted image 20240415172223.png]]
unity客户端,对应的入口逻辑,也修改一下ip
![[Pasted image 20240415172559.png]]
重新开服务器,调试
![[Pasted image 20240415172633.png]]
游戏运行,log正常
![[Pasted image 20240415172659.png]]
Space空格键,发送unity客户端字符消息,Escape退出键,关闭客户端连接
![[Pasted image 20240415172751.png]]
unity,敲空格,服务器接收信息,表现正常
![[Pasted image 20240415172852.png]]
测试正常下线,按Escape退出键,unity客户端,打印正常
![[Pasted image 20240415172921.png]]
服务器log,表现正常
![[Pasted image 20240415172953.png]]
重新开服务器,重新运行unity,服务器输入quit,测试,服务器正常下线,敲回车
![[Pasted image 20240415173053.png]]
服务器log,表现正常
![[Pasted image 20240415173129.png]]
unity的log,表现正常
![[Pasted image 20240415173149.png]]