NetworkManager.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 Jiang Yin. All rights reserved.
  4. // Homepage: https://gameframework.cn/
  5. // Feedback: mailto:ellan@gameframework.cn
  6. //------------------------------------------------------------
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Net.Sockets;
  10. namespace GameFramework.Network
  11. {
  12. /// <summary>
  13. /// 网络管理器。
  14. /// </summary>
  15. internal sealed partial class NetworkManager : GameFrameworkModule, INetworkManager
  16. {
  17. private readonly Dictionary<string, NetworkChannelBase> m_NetworkChannels;
  18. private EventHandler<NetworkConnectedEventArgs> m_NetworkConnectedEventHandler;
  19. private EventHandler<NetworkClosedEventArgs> m_NetworkClosedEventHandler;
  20. private EventHandler<NetworkMissHeartBeatEventArgs> m_NetworkMissHeartBeatEventHandler;
  21. private EventHandler<NetworkErrorEventArgs> m_NetworkErrorEventHandler;
  22. private EventHandler<NetworkCustomErrorEventArgs> m_NetworkCustomErrorEventHandler;
  23. /// <summary>
  24. /// 初始化网络管理器的新实例。
  25. /// </summary>
  26. public NetworkManager()
  27. {
  28. m_NetworkChannels = new Dictionary<string, NetworkChannelBase>(StringComparer.Ordinal);
  29. m_NetworkConnectedEventHandler = null;
  30. m_NetworkClosedEventHandler = null;
  31. m_NetworkMissHeartBeatEventHandler = null;
  32. m_NetworkErrorEventHandler = null;
  33. m_NetworkCustomErrorEventHandler = null;
  34. }
  35. /// <summary>
  36. /// 获取网络频道数量。
  37. /// </summary>
  38. public int NetworkChannelCount
  39. {
  40. get
  41. {
  42. return m_NetworkChannels.Count;
  43. }
  44. }
  45. /// <summary>
  46. /// 网络连接成功事件。
  47. /// </summary>
  48. public event EventHandler<NetworkConnectedEventArgs> NetworkConnected
  49. {
  50. add
  51. {
  52. m_NetworkConnectedEventHandler += value;
  53. }
  54. remove
  55. {
  56. m_NetworkConnectedEventHandler -= value;
  57. }
  58. }
  59. /// <summary>
  60. /// 网络连接关闭事件。
  61. /// </summary>
  62. public event EventHandler<NetworkClosedEventArgs> NetworkClosed
  63. {
  64. add
  65. {
  66. m_NetworkClosedEventHandler += value;
  67. }
  68. remove
  69. {
  70. m_NetworkClosedEventHandler -= value;
  71. }
  72. }
  73. /// <summary>
  74. /// 网络心跳包丢失事件。
  75. /// </summary>
  76. public event EventHandler<NetworkMissHeartBeatEventArgs> NetworkMissHeartBeat
  77. {
  78. add
  79. {
  80. m_NetworkMissHeartBeatEventHandler += value;
  81. }
  82. remove
  83. {
  84. m_NetworkMissHeartBeatEventHandler -= value;
  85. }
  86. }
  87. /// <summary>
  88. /// 网络错误事件。
  89. /// </summary>
  90. public event EventHandler<NetworkErrorEventArgs> NetworkError
  91. {
  92. add
  93. {
  94. m_NetworkErrorEventHandler += value;
  95. }
  96. remove
  97. {
  98. m_NetworkErrorEventHandler -= value;
  99. }
  100. }
  101. /// <summary>
  102. /// 用户自定义网络错误事件。
  103. /// </summary>
  104. public event EventHandler<NetworkCustomErrorEventArgs> NetworkCustomError
  105. {
  106. add
  107. {
  108. m_NetworkCustomErrorEventHandler += value;
  109. }
  110. remove
  111. {
  112. m_NetworkCustomErrorEventHandler -= value;
  113. }
  114. }
  115. /// <summary>
  116. /// 网络管理器轮询。
  117. /// </summary>
  118. /// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
  119. /// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
  120. internal override void Update(float elapseSeconds, float realElapseSeconds)
  121. {
  122. foreach (KeyValuePair<string, NetworkChannelBase> networkChannel in m_NetworkChannels)
  123. {
  124. networkChannel.Value.Update(elapseSeconds, realElapseSeconds);
  125. }
  126. }
  127. /// <summary>
  128. /// 关闭并清理网络管理器。
  129. /// </summary>
  130. internal override void Shutdown()
  131. {
  132. foreach (KeyValuePair<string, NetworkChannelBase> networkChannel in m_NetworkChannels)
  133. {
  134. NetworkChannelBase networkChannelBase = networkChannel.Value;
  135. networkChannelBase.NetworkChannelConnected -= OnNetworkChannelConnected;
  136. networkChannelBase.NetworkChannelClosed -= OnNetworkChannelClosed;
  137. networkChannelBase.NetworkChannelMissHeartBeat -= OnNetworkChannelMissHeartBeat;
  138. networkChannelBase.NetworkChannelError -= OnNetworkChannelError;
  139. networkChannelBase.NetworkChannelCustomError -= OnNetworkChannelCustomError;
  140. networkChannelBase.Shutdown();
  141. }
  142. m_NetworkChannels.Clear();
  143. }
  144. /// <summary>
  145. /// 检查是否存在网络频道。
  146. /// </summary>
  147. /// <param name="name">网络频道名称。</param>
  148. /// <returns>是否存在网络频道。</returns>
  149. public bool HasNetworkChannel(string name)
  150. {
  151. return m_NetworkChannels.ContainsKey(name ?? string.Empty);
  152. }
  153. /// <summary>
  154. /// 获取网络频道。
  155. /// </summary>
  156. /// <param name="name">网络频道名称。</param>
  157. /// <returns>要获取的网络频道。</returns>
  158. public INetworkChannel GetNetworkChannel(string name)
  159. {
  160. NetworkChannelBase networkChannel = null;
  161. if (m_NetworkChannels.TryGetValue(name ?? string.Empty, out networkChannel))
  162. {
  163. return networkChannel;
  164. }
  165. return null;
  166. }
  167. /// <summary>
  168. /// 获取所有网络频道。
  169. /// </summary>
  170. /// <returns>所有网络频道。</returns>
  171. public INetworkChannel[] GetAllNetworkChannels()
  172. {
  173. int index = 0;
  174. INetworkChannel[] results = new INetworkChannel[m_NetworkChannels.Count];
  175. foreach (KeyValuePair<string, NetworkChannelBase> networkChannel in m_NetworkChannels)
  176. {
  177. results[index++] = networkChannel.Value;
  178. }
  179. return results;
  180. }
  181. /// <summary>
  182. /// 获取所有网络频道。
  183. /// </summary>
  184. /// <param name="results">所有网络频道。</param>
  185. public void GetAllNetworkChannels(List<INetworkChannel> results)
  186. {
  187. if (results == null)
  188. {
  189. throw new GameFrameworkException("Results is invalid.");
  190. }
  191. results.Clear();
  192. foreach (KeyValuePair<string, NetworkChannelBase> networkChannel in m_NetworkChannels)
  193. {
  194. results.Add(networkChannel.Value);
  195. }
  196. }
  197. /// <summary>
  198. /// 创建网络频道。
  199. /// </summary>
  200. /// <param name="name">网络频道名称。</param>
  201. /// <param name="serviceType">网络服务类型。</param>
  202. /// <param name="networkChannelHelper">网络频道辅助器。</param>
  203. /// <returns>要创建的网络频道。</returns>
  204. public INetworkChannel CreateNetworkChannel(string name, ServiceType serviceType, INetworkChannelHelper networkChannelHelper)
  205. {
  206. if (networkChannelHelper == null)
  207. {
  208. throw new GameFrameworkException("Network channel helper is invalid.");
  209. }
  210. if (networkChannelHelper.PacketHeaderLength < 0)
  211. {
  212. throw new GameFrameworkException("Packet header length is invalid.");
  213. }
  214. if (HasNetworkChannel(name))
  215. {
  216. throw new GameFrameworkException(Utility.Text.Format("Already exist network channel '{0}'.", name ?? string.Empty));
  217. }
  218. NetworkChannelBase networkChannel = null;
  219. switch (serviceType)
  220. {
  221. case ServiceType.Tcp:
  222. networkChannel = new TcpNetworkChannel(name, networkChannelHelper);
  223. break;
  224. case ServiceType.TcpWithSyncReceive:
  225. networkChannel = new TcpWithSyncReceiveNetworkChannel(name, networkChannelHelper);
  226. break;
  227. default:
  228. throw new GameFrameworkException(Utility.Text.Format("Not supported service type '{0}'.", serviceType.ToString()));
  229. }
  230. networkChannel.NetworkChannelConnected += OnNetworkChannelConnected;
  231. networkChannel.NetworkChannelClosed += OnNetworkChannelClosed;
  232. networkChannel.NetworkChannelMissHeartBeat += OnNetworkChannelMissHeartBeat;
  233. networkChannel.NetworkChannelError += OnNetworkChannelError;
  234. networkChannel.NetworkChannelCustomError += OnNetworkChannelCustomError;
  235. m_NetworkChannels.Add(name, networkChannel);
  236. return networkChannel;
  237. }
  238. /// <summary>
  239. /// 销毁网络频道。
  240. /// </summary>
  241. /// <param name="name">网络频道名称。</param>
  242. /// <returns>是否销毁网络频道成功。</returns>
  243. public bool DestroyNetworkChannel(string name)
  244. {
  245. NetworkChannelBase networkChannel = null;
  246. if (m_NetworkChannels.TryGetValue(name ?? string.Empty, out networkChannel))
  247. {
  248. networkChannel.NetworkChannelConnected -= OnNetworkChannelConnected;
  249. networkChannel.NetworkChannelClosed -= OnNetworkChannelClosed;
  250. networkChannel.NetworkChannelMissHeartBeat -= OnNetworkChannelMissHeartBeat;
  251. networkChannel.NetworkChannelError -= OnNetworkChannelError;
  252. networkChannel.NetworkChannelCustomError -= OnNetworkChannelCustomError;
  253. networkChannel.Shutdown();
  254. return m_NetworkChannels.Remove(name);
  255. }
  256. return false;
  257. }
  258. private void OnNetworkChannelConnected(NetworkChannelBase networkChannel, object userData)
  259. {
  260. if (m_NetworkConnectedEventHandler != null)
  261. {
  262. lock (m_NetworkConnectedEventHandler)
  263. {
  264. NetworkConnectedEventArgs networkConnectedEventArgs = NetworkConnectedEventArgs.Create(networkChannel, userData);
  265. m_NetworkConnectedEventHandler(this, networkConnectedEventArgs);
  266. ReferencePool.Release(networkConnectedEventArgs);
  267. }
  268. }
  269. }
  270. private void OnNetworkChannelClosed(NetworkChannelBase networkChannel)
  271. {
  272. if (m_NetworkClosedEventHandler != null)
  273. {
  274. lock (m_NetworkClosedEventHandler)
  275. {
  276. NetworkClosedEventArgs networkClosedEventArgs = NetworkClosedEventArgs.Create(networkChannel);
  277. m_NetworkClosedEventHandler(this, networkClosedEventArgs);
  278. ReferencePool.Release(networkClosedEventArgs);
  279. }
  280. }
  281. }
  282. private void OnNetworkChannelMissHeartBeat(NetworkChannelBase networkChannel, int missHeartBeatCount)
  283. {
  284. if (m_NetworkMissHeartBeatEventHandler != null)
  285. {
  286. lock (m_NetworkMissHeartBeatEventHandler)
  287. {
  288. NetworkMissHeartBeatEventArgs networkMissHeartBeatEventArgs = NetworkMissHeartBeatEventArgs.Create(networkChannel, missHeartBeatCount);
  289. m_NetworkMissHeartBeatEventHandler(this, networkMissHeartBeatEventArgs);
  290. ReferencePool.Release(networkMissHeartBeatEventArgs);
  291. }
  292. }
  293. }
  294. private void OnNetworkChannelError(NetworkChannelBase networkChannel, NetworkErrorCode errorCode, SocketError socketErrorCode, string errorMessage)
  295. {
  296. if (m_NetworkErrorEventHandler != null)
  297. {
  298. lock (m_NetworkErrorEventHandler)
  299. {
  300. NetworkErrorEventArgs networkErrorEventArgs = NetworkErrorEventArgs.Create(networkChannel, errorCode, socketErrorCode, errorMessage);
  301. m_NetworkErrorEventHandler(this, networkErrorEventArgs);
  302. ReferencePool.Release(networkErrorEventArgs);
  303. }
  304. }
  305. }
  306. private void OnNetworkChannelCustomError(NetworkChannelBase networkChannel, object customErrorData)
  307. {
  308. if (m_NetworkCustomErrorEventHandler != null)
  309. {
  310. lock (m_NetworkCustomErrorEventHandler)
  311. {
  312. NetworkCustomErrorEventArgs networkCustomErrorEventArgs = NetworkCustomErrorEventArgs.Create(networkChannel, customErrorData);
  313. m_NetworkCustomErrorEventHandler(this, networkCustomErrorEventArgs);
  314. ReferencePool.Release(networkCustomErrorEventArgs);
  315. }
  316. }
  317. }
  318. }
  319. }