ET服务器框架学习笔记(十六)
文章目录
前言
前面几篇文章对ET的核心通信模块做了一个大致的梳理,接下来的文章就对ET中其他组件来个查漏补缺。
一、AppManagerComponent
AppManagerComponent用于管理其他进程使用。当一台机器上多开几个不同的进程服务。
1.NetHelper
NetHelper类所的事情就一个,获取与本机关联的所有IP地址,并将其转换成字符串存入List addressIPs中,然后转换为string[]。主要通过1.Dns.GetHostName()获取主机名,2.Dns.GetHostEntry(Dns.GetHostName()),拿到一个与这个主机关联的IPHostEntry,3.拿到IPHostEntry的AddressList即为本机的所有IP地址。
2.AppManagerComponent的Awake
- 首先调用NetHelper获取本机的所有ip地址,然后拿到配置里面的所有配置
- 遍历配置里面的每一条启动配置,如果启动配置里面的ServerIP不在本机IP内,并且不为*,那么就调过。
- 不跳过时,意味着ServerIP 为*,或者包含了启动ip在本机ip中,如果服务类型是Manager,也调过。
- 剩下的意味着,配置里面的启动项为本机需要启动的,所以调用StartProcess启动对应的App
这里需要注意一点,就是ALLServer是包含所有类型的,所以也会在这里判定为Manager,所以调过了。
3.AppManagerComponent的StartProcess
这个函数用于启动其他服务,原理与从客户端命令来启动服务端一样。
- 通过OptionComponent组件,获取服务端启动时的命令行参数
- 通过StartConfigComponent组件Get方法,传入appId,拿到对应appId的启动配置。
- 调制启动参数:string arguments = $“App.dll --appId={startConfig.AppId} --appType={startConfig.AppType} --config={configFile}”;
- 调用 ProcessHelper.Run协助启动进程,并将其放入到processes内部进行管理。
4.ProcessHelper的Run
这个类,用于使用代码动态启动一个进程,其中判断了不同平台下的进程启动选项,具体可以去微软官方查看,这里不过过多的解读,反正都是用的时候去查下:微软官方文档
5.AppManagerComponent的StartProcess
回到AppManagerComponent类,查看最后一个函数WatchProcessAsync。这个函数使用进程的HasExited属性来判定进程是否挂了,如果挂了,就调用Dispose将进程相关释放掉,然后重新调用StartProcess即可。
需要关注的是WatchProcessAsync内部使用while(true),然后有个await Game.Scene.GetComponent().WaitAsync(5000);每5秒检测一次。
总结
这篇开始介绍ET中各个比较零碎的功能与组件,本篇介绍的是ET的服务管理(各个服务进程的管理),下篇介绍一下ET5.0中的寻路,在烟雨大佬的Gitee中,貌似添加了服务器的recastnavigation寻路库,有空也研究一下吧。