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