NetworkManager.lua.txt 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. local NetworkManager = {}
  2. --[[
  3. 1. 心跳包要隔一段时间发送一次
  4. 2. 两个周期没有收到返回消息 弹出提示 断线重连
  5. ]]
  6. local function ConnectServer(serverIP, serverPort)
  7. local connectState = CS.LuaSocketManager.Connect(serverIP, serverPort)
  8. NetworkManager.connectState = connectState
  9. return connectState
  10. end
  11. local function ConnectLogicCoroutine()
  12. print("----> ConnectLogicCoroutine:")
  13. local serverIP = "192.168.1.85"
  14. local serverPort = 9305
  15. local eventManager = require("Base/ZEventDispatchCenter.lua")
  16. require("Base/CoroutineHelper.lua"):WaitForEndOfFrame()
  17. local hasFailed = false
  18. local condition = false
  19. while condition == false do
  20. local connectState = SafeCall(ConnectServer, serverIP, serverPort)
  21. NetworkManager.connectState = connectState
  22. if not connectState then
  23. print(string.format(
  24. "NetworkManager.ConnectLogicCoroutine ConnectServer(%s:%s) Failed. Retry after 5s:",
  25. serverIP, serverPort, connectState
  26. ))
  27. eventManager:DispatchEvent(eventManager.EventType.NET_CONNECT_STATE, false)
  28. hasFailed = true
  29. require("Base/CoroutineHelper.lua"):Wait(5)
  30. end
  31. condition = connectState == true
  32. end
  33. print(string.format( "NetworkManager.ConnectLogicCoroutine ConnectServer(%s:%s) Success!", serverIP, serverPort))
  34. if hasFailed == true then
  35. -- todo
  36. -- local languageConfig = require("Config/SConfigManager.lua"):GetConfig("languageConfig")
  37. -- ShowDialogOK(languageConfig["login"]["connect_success"])
  38. -- eventManager:DispatchEvent(eventManager.EventType.NET_CONNECT_STATE, true)
  39. end
  40. require("Network/NetworkQueue.lua"):Reset()
  41. end
  42. local function RecvlogicCoroutine()
  43. while true do
  44. require("Base/CoroutineHelper.lua"):Wait(0.1)
  45. local connectState = CS.LuaSocketManager.Update()
  46. -- todo 待办
  47. if not connectState then
  48. -- 断线重连
  49. return
  50. end
  51. local serverMessage = CS.LuaSocketManager.RecvMessage()
  52. if serverMessage ~= "" and serverMessage ~= nil then
  53. local serverProtocol = NetworkManager._jsonConvert:decode(serverMessage)
  54. local processorName = serverProtocol.msgType
  55. print("----> processorName:", processorName)
  56. if not processorName then print("Get processorName Failed for: ", serverMessage) end
  57. local msgType = NetworkManager._s2c[serverProtocol.msgType]
  58. if not msgType then print("Get msgType failed for : " , serverMessage) end
  59. local NetworkQueue = require("Network/NetworkQueue.lua")
  60. NetworkQueue:PushMsgOnRecv(tonumber(serverProtocol.uid), serverProtocol)
  61. -- local data = NetworkQueue:TryPopMsg()
  62. -- while data ~= nil do
  63. -- local func = NetworkManager._s2c[data.msgType]
  64. -- func(NetworkManager._s2c, data)
  65. -- data = NetworkQueue:TryPopMsg()
  66. -- end
  67. msgType(NetworkManager._s2c, serverProtocol)
  68. end
  69. end
  70. end
  71. local function HeartBeatCoroutine()
  72. local nMaxCount = 3
  73. local eventManager = require("Base/ZEventDispatchCenter.lua")
  74. while true do
  75. require("Network/C2S.lua"):HeartBeat()
  76. require("Base/CoroutineHelper.lua"):Wait(10)
  77. local nHeartBeat = GetCache("HEART_BEAT", 0)
  78. nHeartBeat = nHeartBeat + 1
  79. if nHeartBeat >= nMaxCount then
  80. require("Base/CoroutineHelper.lua"):Stop(NetworkManager._heartBeatCorutine)
  81. -- todo 用户掉线
  82. end
  83. end
  84. end
  85. function NetworkManager:Init()
  86. print("NetworkManager.Init~")
  87. self._c2s = require("Network/C2S.lua")
  88. self._s2c = require("Network/S2C.lua")
  89. self._connectLogicCoroutine = require("Base/CoroutineHelper.lua"):Start(ConnectLogicCoroutine)
  90. self._recvlogicCoroutine = require("Base/CoroutineHelper.lua"):Start(RecvlogicCoroutine)
  91. self._jsonConvert = require("Base/json.lua")
  92. -- todo for test: 测试环节暂时不做心跳
  93. -- self._heartBeatCorutine = require("Base/CoroutineHelper.lua"):Start(HeartBeatCoroutine)
  94. end
  95. function NetworkManager:UnInit()
  96. require("Base/CoroutineHelper.lua"):Stop(NetworkManager._connectLogicCoroutine)
  97. require("Base/CoroutineHelper.lua"):Stop(NetworkManager._recvlogicCoroutine)
  98. -- require("Base/CoroutineHelper.lua"):Stop(NetworkManager._heartBeatCorutine)
  99. print("NetworkManager.UnInit ~")
  100. end
  101. function NetworkManager:RemoteCall(funcName, ... )
  102. print("NetworkManager:RemoteCall funcName:", funcName, " param:", ...)
  103. self._c2s:RemoteCall(funcName, ...)
  104. end
  105. function NetworkManager:EnterMeeting(meetingId, tel, szNick)
  106. if not self.connectState then
  107. print("Network is not ready.");
  108. return
  109. end
  110. self._c2s:EnterMeeting(meetingId, tel, szNick)
  111. end
  112. function NetworkManager:GetScreenInfo(meetingId)
  113. print("----> NetworkManager:GetScreenInfo, meetingId:", meetingId)
  114. if not self.connectState then
  115. print("Network is not ready.");
  116. return
  117. end
  118. -- todo: 龙哥暂时没给文档
  119. self._c2s:GetScreenInfo(meetingId)
  120. end
  121. return NetworkManager