ReconnectPolicy.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using System;
  2. using UnityEngine;
  3. public delegate uint tryReconnectDelegate(uint nCount, uint nMax);
  4. /// <summary>
  5. /// 网络重连策略
  6. /// </summary>
  7. public class ReconnectPolicy
  8. {
  9. private GameBaseConnector connector = null;
  10. private tryReconnectDelegate callback = null;
  11. private Action policyCompleted = null;
  12. private bool sessionStopped = false;
  13. private float reconnectTime = 0;
  14. private uint reconnectCount = 4;
  15. private uint tryCount = 0;
  16. private uint connectTimeout = 10; //超时,单位秒
  17. public bool shouldReconnect = false;
  18. public void SetConnector(GameBaseConnector inConnector, tryReconnectDelegate inEvent, Action inPolicyCompleted, uint tryMax)
  19. {
  20. sessionStopped = false;
  21. shouldReconnect = false;
  22. connector = inConnector;
  23. callback = inEvent;
  24. policyCompleted = inPolicyCompleted;
  25. reconnectCount = tryMax;
  26. Debug.Log(string.Format("connector:{0}, tryMax:{1}", inConnector != null ? inConnector.ToString() : "", tryMax));
  27. }
  28. public void StopPolicy()
  29. {
  30. sessionStopped = false;
  31. shouldReconnect = false;
  32. reconnectTime = connectTimeout;
  33. tryCount = 0;
  34. }
  35. public void StartPolicy(enNetResult result, int timeWait)
  36. {
  37. switch (result)
  38. {
  39. case enNetResult.Success:
  40. {
  41. shouldReconnect = false;
  42. sessionStopped = false;
  43. }
  44. break;
  45. case enNetResult.ConnectFailed:
  46. case enNetResult.Timeout:
  47. case enNetResult.Error:
  48. {
  49. shouldReconnect = true;
  50. sessionStopped = true;
  51. reconnectTime = (tryCount == 0 ? 0 : timeWait);
  52. }
  53. break;
  54. default:
  55. {
  56. shouldReconnect = true;
  57. sessionStopped = true;
  58. reconnectTime = (tryCount == 0 ? 0 : timeWait);
  59. }
  60. break;
  61. }
  62. }
  63. public void UpdatePolicy(bool bForce)
  64. {
  65. if (!shouldReconnect)
  66. {
  67. return;
  68. }
  69. if (connector != null && !connector.Connected)
  70. {
  71. if (bForce)
  72. {
  73. reconnectTime = connectTimeout;
  74. tryCount = reconnectCount;
  75. if (sessionStopped)
  76. {
  77. connector.RestartConnector();
  78. }
  79. else
  80. {
  81. connector.RestartConnector();
  82. }
  83. }
  84. else
  85. {
  86. reconnectTime -= Time.unscaledDeltaTime;
  87. if (reconnectTime < 0)
  88. {
  89. tryCount++;
  90. reconnectTime = connectTimeout;
  91. var testCount = tryCount;
  92. if (callback != null)
  93. {
  94. testCount = callback(testCount, reconnectCount);
  95. }
  96. if (testCount > reconnectCount)
  97. {
  98. StopPolicy();
  99. if (policyCompleted != null)
  100. {
  101. policyCompleted();
  102. }
  103. return;
  104. }
  105. tryCount = testCount;
  106. if (sessionStopped)
  107. {
  108. connector.RestartConnector();
  109. }
  110. else
  111. {
  112. connector.RestartConnector();
  113. }
  114. }
  115. }
  116. }
  117. }
  118. }