开发IOCP高性能网络库_第三章
IOCPNet网络库,对应Server服务端的,具体逻辑,其中声明的变量,curConnCount是当前连接的,客户端总数,backlog是用于Socket.Listen的监听挂起最大数,acceptSeamaphore是semaphore信号量,用于线程控制相关; 而pool就是之前解析的,用于服务端的,IOCPTokenPool缓存池,用来存储,以后用于连接的,Client客户端Token连接; 还有一个List容器的tokenLst,存储的是,当前连接的客户端token连接;
StartAccept函数接口,是开启连接的具体逻辑,信号量的WaitOne调用,是继承自WaitHandle.WaitOne 方法,等待接收到,连接请求的信号; 通过Socket.AcceptAsync的返回值,判断异步任务是否完成,进而调用ProcessAccept函数接口,开始连接,客户端token相关;
通过Interlocked.Increment函数接口,配合ref关键字,完成,当前连接的客户端Token总数curConnCount的递增,参考out和ref之间的区别; 然后,从pool缓存池,通过Pop函数接口,提取一个token连接,加到当前连接的tokenLst队列容器; 调用InitToken函数接口,完成token的初始化,还会完成,token关闭回调的绑定注册OnTokenClose,后续解析; 最后再重新调用,StartAccept函数接口;
网络库中,OnTokenClose函数接口,对应的是,服务器连接的Token关闭逻辑; 通过传参tokenID,从当前连接的tokenLst队列容器,拿到对应的Token,Push放回pool缓存池,remove移除在tokenLst队列容器中,对应的元素; 再使用Interlocked.Decrement完成,当前连接的客户端Token总数curConnCount的递减,使用信号量的Release释放;
CloseServer函数接口,是关闭服务器的具体逻辑,会遍历当前连接Token的队列容器tokenLst,调用其中token连接的,CloseToken函数接口; 而GetTokenLst函数接口,是对应容器tokenLst的获取器;
StartAsServer函数接口,对应的是,开启一个服务器,其中传参有ip地址、port端口号,还有最大token连接数,用来构建,IOCPTokenPool缓存池; backLog设定上是100,服务器对应的,监听最大挂起数; 完成服务器的构建、初始化后,调用之前解析的StartAccept函数接口,开启监听即可;
这是服务器实例的,具体逻辑,设定IOCPToken连接的,最大缓存池数目是10000,在while死循环中,进行ReadLine输入监听,如果输入“quit”字符,回车,就会CloseServer关闭服务器; 如果输入,其他字符,就是遍历所有,连接的客户端Token,发送broadcast前缀的相关消息,也就是广播的逻辑实现;
客户端的实例逻辑,也是while死循环,ReadLine监听输入,如果输入”quit“字符,就ClosetClient关闭客户端; 否则else,就会构建NetMsg网络消息包,SendMsg发送即可;
先右键,开始调试,服务器
客户端同理
unity客户端,也有对应的token连接,继承自IOCPToken,完成连接、断连、接收消息,仨函数的重写,也是log打印
游戏根节点,挂载的测试脚本,其中Update更新函数,也是监听按键,如果是空格键,就会发送消息给服务端、如果是Esc退出键,就会关闭客户端
挂载位置,运行游戏
log也正常
服务端和客户端实例log,也正常
测试,客户端实例,字符输入,回车
服务端,接收消息,log正常
unity客户端,运行时,按下空格,服务端,log正常
服务端,输入字符,回车,测试广播
客户端实例,unity客户端,log都正常
unity客户端,运行时,按Esc退出键,关闭客户端的log,正常; 服务端log,也正常;
客户端实例,点击,停止调试,服务端log,也正常