NetworkManager.lua.txt 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. local NetworkManager = {}
  2. local nHeartBeatTime = 25
  3. --[[
  4. 1. 心跳包要隔25s时间发送一次
  5. 2. 两个周期没有收到即视为掉线
  6. ]]
  7. -- local bShowReconnect = false
  8. -- -- todo 不知道是在会议里还是会议外
  9. -- local function CloseMeetingUI()
  10. -- local uiHelper = require("Base/UIHelper.lua")
  11. -- uiHelper:SwitchUI("UI/EnterMeeting/ZUIPanelEnterMeeting.lua", "UI/Meeting/ZUIPanelMeetingManager.lua")
  12. -- uiHelper:CloseUI("UI/ZMeetingSceneManager.lua")
  13. -- bShowReconnect = false
  14. -- end
  15. -- local function ReConnectServer()
  16. -- if bShowReconnect then
  17. -- return
  18. -- end
  19. -- bShowReconnect = true
  20. -- ShowDialogOK("NetworkManager", "与服务器连接断开, 请重试", CloseMeetingUI)
  21. -- end
  22. local function ConnectServer(serverIP, serverPort)
  23. local connectState = CS.LuaSocketManager.Connect(serverIP, serverPort)
  24. NetworkManager.connectState = connectState
  25. return connectState
  26. end
  27. local function ConnectLogicCoroutine()
  28. print("----> ConnectLogicCoroutine:")
  29. -- local serverIP = "192.168.3.248" -- longyue
  30. -- local serverPort = 9205
  31. -- local serverIP = "192.168.0.55" -- server
  32. local serverIP = "192.168.0.200" -- server
  33. local serverPort = 9206
  34. local eventManager = require("Base/ZEventDispatchCenter.lua")
  35. require("Base/CoroutineHelper.lua"):WaitForEndOfFrame()
  36. local hasFailed = false
  37. local condition = false
  38. while condition == false do
  39. -- todo 不能用这个判断是否链接上服务器了
  40. local connectState = SafeCall(ConnectServer, serverIP, serverPort)
  41. NetworkManager.connectState = connectState
  42. if not connectState then
  43. print(string.format(
  44. "NetworkManager.ConnectLogicCoroutine ConnectServer(%s:%s) Failed. Retry after 5s:",
  45. serverIP, serverPort, connectState
  46. ))
  47. eventManager:DispatchEvent(eventManager.EventType.NET_CONNECT_STATE, false)
  48. hasFailed = true
  49. require("Base/CoroutineHelper.lua"):Wait(5)
  50. end
  51. condition = connectState == true
  52. end
  53. print(string.format( "NetworkManager.ConnectLogicCoroutine ConnectServer(%s:%s) Success!", serverIP, serverPort))
  54. if hasFailed == true then
  55. -- todo
  56. -- local languageConfig = require("Config/SConfigManager.lua"):GetConfig("languageConfig")
  57. -- ShowDialogOK(languageConfig["login"]["connect_success"])
  58. -- eventManager:DispatchEvent(eventManager.EventType.NET_CONNECT_STATE, true)
  59. end
  60. require("Network/NetworkQueue.lua"):Reset()
  61. end
  62. local function RecvlogicCoroutine()
  63. while true do
  64. require("Base/CoroutineHelper.lua"):Wait(0.1)
  65. local connectState = CS.LuaSocketManager.Update()
  66. NetworkManager.connectState = connectState
  67. -- todo 待办
  68. if not connectState then
  69. -- 断线重连
  70. return
  71. end
  72. local serverMessage = CS.LuaSocketManager.RecvMessage()
  73. -- if serverMessage ~= nil and serverMessage.msgType and serverMessage.msgData then
  74. while serverMessage ~= nil and serverMessage.msgType and serverMessage.msgData do
  75. print("----> serverMessage.msgData", serverMessage.msgData)
  76. local serverProtocol = NetworkManager._jsonConvert:decode(serverMessage.msgData)
  77. -- local processorName = serverMessage.msgType
  78. -- print("----> processorName:", processorName)
  79. -- if not processorName then print("Get processorName Failed for: ", serverMessage) end
  80. local msgType = NetworkManager._s2c[serverMessage.msgType]
  81. if not msgType then
  82. print("Get msgType failed for : " , serverMessage.msgType, " ", serverMessage.msgData)
  83. end
  84. -- local NetworkQueue = require("Network/NetworkQueue.lua")
  85. -- NetworkQueue:PushMsgOnRecv(tonumber(serverMessage.requestNumber), {serverMessage.msgType, serverProtocol})
  86. -- local data = NetworkQueue:TryPopMsg()
  87. -- while data ~= nil do
  88. -- local func = NetworkManager._s2c[data[1]]
  89. -- func(NetworkManager._s2c, data[2])
  90. -- data = NetworkQueue:TryPopMsg()
  91. -- end
  92. msgType(NetworkManager._s2c, serverProtocol)
  93. serverMessage = CS.LuaSocketManager.RecvMessage()
  94. end
  95. end
  96. end
  97. local function HeartBeatCoroutine()
  98. local nMaxCount = 3
  99. local eventManager = require("Base/ZEventDispatchCenter.lua")
  100. while true do
  101. require("Network/C2S.lua"):HeartBeat()
  102. require("Base/CoroutineHelper.lua"):Wait(nHeartBeatTime)
  103. local nHeartBeat = require("Base/DataRelay.lua"):GetCache("HEART_BEAT", 0)
  104. nHeartBeat = nHeartBeat + 1
  105. if nHeartBeat >= nMaxCount then
  106. require("Base/CoroutineHelper.lua"):Stop(NetworkManager._heartBeatCorutine)
  107. -- todo 用户掉线
  108. end
  109. end
  110. end
  111. local function InitScoketInfo()
  112. CS.ZLog.Options.Instance.LogLevel = 2
  113. CS.ZLog.Log.Debug("")
  114. end
  115. function NetworkManager:Init()
  116. print("NetworkManager.Init~")
  117. InitScoketInfo()
  118. self._c2s = require("Network/C2S.lua")
  119. self._s2c = require("Network/S2C.lua")
  120. self._connectLogicCoroutine = require("Base/CoroutineHelper.lua"):Start(ConnectLogicCoroutine)
  121. self._recvlogicCoroutine = require("Base/CoroutineHelper.lua"):Start(RecvlogicCoroutine)
  122. self._jsonConvert = require("Base/json.lua")
  123. self._eventManager = require("Base/ZEventDispatchCenter.lua")
  124. -- 心跳
  125. self._heartBeatCorutine = require("Base/CoroutineHelper.lua"):Start(HeartBeatCoroutine)
  126. end
  127. function NetworkManager:UnInit()
  128. require("Base/CoroutineHelper.lua"):Stop(NetworkManager._connectLogicCoroutine)
  129. require("Base/CoroutineHelper.lua"):Stop(NetworkManager._recvlogicCoroutine)
  130. -- 心跳
  131. require("Base/CoroutineHelper.lua"):Stop(NetworkManager._heartBeatCorutine)
  132. CS.LuaSocketManager.Disconnect()
  133. print("NetworkManager.UnInit ~")
  134. end
  135. function NetworkManager:RemoteCall(funcName, ... )
  136. print("NetworkManager:RemoteCall funcName:", funcName, " param:", ...)
  137. self._c2s:RemoteCall(funcName, ...)
  138. end
  139. return NetworkManager