初始化连接的是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` ``` shell 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]]