MiddleConnect.lua 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. -- 跨服鏈接和重连管理
  2. local msg_parse = _G.msg_inner_parse
  3. local Config = require("Config")
  4. local Log = require("common.Log")
  5. local CommonDB = require("common.CommonDB")
  6. local InnerMsg = require("core.InnerMsg")
  7. local MiddleManager = require("middle.MiddleManager")
  8. local MiddleHeartBeat = require("middle.MiddleHeartBeat")
  9. local Define = require("platform.Define")
  10. local Json = require("common.Json")
  11. local JjcLadderMiddle = require("jjcLadder.JjcLadderMiddle")
  12. local WarZoneConf = require("excel.WarZone") --- 战区配置
  13. local ChatHandler = require("chat.Handler")
  14. local MiddleCommonRank = require("middle.MiddleCommonRank")
  15. local BanLogic = require("scene.BanLogic")
  16. IS_MIDDLE_CONNECT = IS_MIDDLE_CONNECT or nil -- 是否連上跨服 收到WLhello才認為連上了
  17. local nServerOffSet = 810538 -- 配置中服务器ID偏移量
  18. YY_ACT_FLAG = nil
  19. -- 请求middleInfo
  20. local s2aParam = {}
  21. local function questMiddleInfo()
  22. s2aParam.sid = Config.SVR_INDEX
  23. s2aParam.api_cbMethod = "setMiddleInfo"
  24. _G.thread_http.send(Define.MIDDLE_INFO_URL, Json.Encode(s2aParam))
  25. end
  26. -- 获取战区最小和最大服务器ID
  27. function MiddleConnect_GetWarZoneServer(nSeverID)
  28. local tWarZoneConf = WarZoneConf.group
  29. if not tWarZoneConf then
  30. return 0, 0
  31. end
  32. for _, v in pairs(tWarZoneConf) do
  33. if v.nMinServerID <= nSeverID and v.nMaxServerID >= nSeverID then
  34. return v.nMinServerID, v.nMaxServerID
  35. end
  36. end
  37. return 0, 0
  38. end
  39. -- 获取战区服务器ID
  40. function MiddleConnect_ConfServerID2TrueServerID(nServerIDConf)
  41. return nServerIDConf + nServerOffSet - 1
  42. end
  43. -- 获取战区配置服务器ID
  44. function MiddleConnect_TrueServerID2ConfServerID(nServerID)
  45. return nServerID - nServerOffSet + 1
  46. end
  47. function setMiddleInfo(ip, port, host)
  48. if _G.is_middle == true then return end
  49. local middleDBInfo = CommonDB.getMiddleInfo()
  50. if middleDBInfo.ip == ip and middleDBInfo.port == port and middleDBInfo.host == host then
  51. -- 沒變化
  52. return
  53. end
  54. local oldIp = middleDBInfo.ip
  55. local oldPort = middleDBInfo.port
  56. CommonDB.setMiddleInfo(ip, port, host)
  57. if oldIp == ip and oldPort == port then
  58. -- 只有host变了 不需要重連
  59. return
  60. else
  61. tryConnectMiddle(ip, port) -- try的時候會把之前的鏈接斷開
  62. end
  63. end
  64. function getMiddleInfo()
  65. --调试模式使用配置的IP
  66. if Config.IS_DEBUG then
  67. return Config.MIDDLE_IP, Config.MIDDLE_PORT, Config.MIDDLE_HOST
  68. end
  69. local middleDBInfo = CommonDB.getMiddleInfo()
  70. return middleDBInfo.ip, middleDBInfo.port, middleDBInfo.host
  71. end
  72. function initAfterStart()
  73. onTimer() -- 啟動拉取一下middleInfo
  74. MiddleCommonRank.MiddleCommonRank_InitAfterStart()
  75. end
  76. function onTimer()
  77. if _G.is_middle == true then return end
  78. -- 如果没有middleip 去找后台请求middleip 1分钟1次
  79. local ip, port = getMiddleInfo()
  80. if ip == nil then
  81. -- reyes todo get ip
  82. print("no middleInfo try to get")
  83. questMiddleInfo()
  84. return
  85. end
  86. -- 如果ip有了 但是一直没连上 1分钟重连1次
  87. if isConnect() ~= true then
  88. tryConnectMiddle(ip, port)
  89. return
  90. end
  91. -- 如果3分钟之内 没有收到middle的心跳包 并且底层还是连接中的状态 我们认为出故障了 这个时候重连一下middle 这是一个异常处理
  92. if MiddleHeartBeat.LAST_HEARTBEAT_TIME then
  93. local now = os.time()
  94. if now - MiddleHeartBeat.LAST_HEARTBEAT_TIME > 180 then
  95. stopConnectMiddle()
  96. end
  97. end
  98. end
  99. function autoResetMiddle()
  100. if _G.is_middle == true then return end
  101. -- 每周一凌晨2點 斷開鏈接 并且重新取一下php的跨服信息 重新連新跨服
  102. CommonDB.setMiddleInfo(nil, nil, nil)
  103. stopConnectMiddle()
  104. onTimer() -- 拉取一下middleInfo
  105. end
  106. function isConnect()
  107. -- 這個接口和IS_MIDDLE_CONNECT的區別是 這個表示底層鏈接連上了 但是不一定正確收到了middle會包 lua層業務判斷最好別用這個接口 盡量用IS_MIDDLE_CONNECT
  108. local ret = msg_parse.check_connect()
  109. if ret == true then
  110. return true
  111. end
  112. end
  113. function tryConnectMiddle(ip, port)
  114. print("try connect middle ", ip, port)
  115. Log.write(Log.LOGID_INNER_CLOSE, "tryConnectMiddle", ip, port)
  116. msg_parse.set_connect(ip, port)
  117. end
  118. function stopConnectMiddle()
  119. print("stop connect middle ")
  120. Log.write(Log.LOGID_INNER_CLOSE, "stopConnectMiddle")
  121. msg_parse.close_connect()
  122. IS_MIDDLE_CONNECT = nil
  123. MiddleHeartBeat.LAST_HEARTBEAT_TIME = nil
  124. MiddleHeartBeat.LAST_SEND_HB_TS = nil
  125. end
  126. function LW_HELLO(fd, msg)
  127. print("LW Hello fd = "..fd)
  128. --table.print_lua_table(msg)
  129. --local stackTrace = debug.traceback("", 2)
  130. --print("[LW_HELLO] 堆栈信息 "..stackTrace)
  131. Log.write(Log.LOGID_INNER_CLOSE, "LW_HELLO")
  132. MiddleManager.addLogicServer(fd, msg.svrIndex)
  133. local szMsgData = InnerMsg.wl.WL_HELLO
  134. --table.print_lua_table(szMsgData)
  135. szMsgData.nGetSvrID = msg.svrIndex
  136. szMsgData.nNowSvrID = Config.SVR_INDEX
  137. --table.print_lua_table(msg)
  138. --table.print_lua_table(szMsgData)
  139. InnerMsg.sendMsg(fd, szMsgData)
  140. msg = InnerMsg.wl.WL_HEARTBEAT
  141. InnerMsg.sendMsg(fd, msg)
  142. -- 同步其它信息
  143. -- JjcLadderMiddle.sendWLMobaiCnt(fd)
  144. end
  145. function WL_HELLO(fd, msg)
  146. print("WL hello fd = "..fd)
  147. Log.write(Log.LOGID_INNER_CLOSE, "WL_HELLO")
  148. if not IS_MIDDLE_CONNECT then
  149. print("middle server upup!!!---")
  150. IS_MIDDLE_CONNECT = true
  151. local openTime = CommonDB.getServerOpenTime()
  152. if openTime ~= 0 then
  153. -- local msg = InnerMsg.lw.LW_SET
  154. -- msg.openTime = openTime or 0
  155. -- msg.svrIndex = Config.SVR_INDEX
  156. -- InnerMsg.sendMsg(fd, msg)
  157. end
  158. -- BanLogic.NS_Get_BanData()
  159. end
  160. end
  161. function LW_SET(fd,msg)
  162. MiddleManager.setServerOpenDay(fd,msg.svrIndex,msg.openTime)
  163. end
  164. function LW_DISCONNECT(fd, msg)
  165. print("LW_DISCONNECT")
  166. MiddleManager.delLogicServer(fd)
  167. end
  168. --middle断线,C++层触发
  169. function WL_DISCONNECT(fd, msg)
  170. if IS_MIDDLE_CONNECT then
  171. IS_MIDDLE_CONNECT = nil
  172. MiddleHeartBeat.LAST_HEARTBEAT_TIME = nil
  173. MiddleHeartBeat.LAST_SEND_HB_TS = nil
  174. Log.write(Log.LOGID_INNER_CLOSE, "middle server disconnect!!!")
  175. print("middle server disconnect!!!---")
  176. end
  177. end
  178. -- 跨服聊天请求
  179. function LW_MIDDLE_CHAT(fd, msg)
  180. local tAllConnectFD = MiddleManager.MiddleManager_GetAllFD()
  181. if not _G.next(tAllConnectFD) then
  182. print("[LW_MIDDLE_CHAT] 不存在连接上的服务器")
  183. return
  184. end
  185. local szMsgData = InnerMsg.wl.WL_MIDDLE_CHAT
  186. szMsgData.tChatMsg = msg.tChatMsg
  187. local nMsgType = szMsgData.tChatMsg.item.msgType
  188. if ChatHandler.CHAT_TYPE_MIDDLE == nMsgType then
  189. for _, nFD in pairs(tAllConnectFD) do
  190. InnerMsg.sendMsg(nFD, szMsgData)
  191. end
  192. print("[LW_MIDDLE_CHAT] 全服发送消息结束")
  193. elseif ChatHandler.CHAT_TYPE_WARZONE == nMsgType then
  194. local nSendServerID = msg.svrIndex
  195. local nConfServerID = nSendServerID - nServerOffSet + 1
  196. local nMinServerID, nMaxServerID = MiddleConnect_GetWarZoneServer(nConfServerID)
  197. if 0 >= nMinServerID or 0 >= nMaxServerID then
  198. print("[LW_MIDDLE_CHAT 获取不到配置 nSendServerID = "..nSendServerID.." nConfServerID = "..nConfServerID)
  199. return
  200. end
  201. local nServeL, nServerR = nMinServerID + nServerOffSet - 1, nMaxServerID + nServerOffSet - 1
  202. for i = nServeL, nServerR, 1 do
  203. local nFD = MiddleManager.getFDBySvrIndex(i)
  204. if nFD then
  205. InnerMsg.sendMsg(nFD, szMsgData)
  206. else
  207. print("[LW_MIDDLE_CHAT] 不存在对应的fd i = "..i)
  208. end
  209. end
  210. print("[LW_MIDDLE_CHAT] 战区发送消息结束")
  211. else
  212. print("[LW_MIDDLE_CHAT] 未处理的发送消息结束")
  213. end
  214. end
  215. -- 获取聊天英雄信息
  216. function LW_MIDDLE_CHAT_QUERY_HERO_DATA(fd, msg)
  217. local nDesServerID = msg.nDesServerID
  218. local nDesFD = MiddleManager.getFDBySvrIndex(nDesServerID)
  219. if not nDesFD then
  220. print("[LW_MIDDLE_CHAT_QUERY_HERO_DATA] 不存在对应的fd nDesServerID = "..nDesServerID)
  221. return
  222. end
  223. print("[LW_MIDDLE_CHAT_QUERY_HERO_DATA] nDesServerID = "..nDesServerID.." nDesFD = "..nDesFD)
  224. local szMsgData = InnerMsg.wl.WL_MIDDLE_CHAT_QUERY_HERO_DATA
  225. szMsgData.nSrcServerID = msg.nSrcServerID
  226. szMsgData.nSrcUID = msg.nSrcUID
  227. szMsgData.nDesUID = msg.nDesUID
  228. szMsgData.nHeroIndex = msg.nHeroIndex
  229. szMsgData.nChatType = msg.nChatType
  230. InnerMsg.sendMsg(nDesFD, szMsgData)
  231. end
  232. function LW_MIDDLE_CHAT_GET_HERO_DATA(fd, msg)
  233. local nSrcServerID = msg.nSrcServerID
  234. local nSrcFD = MiddleManager.getFDBySvrIndex(nSrcServerID)
  235. if not nSrcFD then
  236. print("[LW_MIDDLE_CHAT_GET_HERO_DATA] 不存在对应的fd nSrcServerID = "..nSrcServerID)
  237. return
  238. end
  239. print("[LW_MIDDLE_CHAT_GET_HERO_DATA] nSrcServerID = "..nSrcServerID.." nSrcFD = "..nSrcFD)
  240. local szMsgData = InnerMsg.wl.WL_MIDDLE_CHAT_GET_HERO_DATA
  241. szMsgData.nSrcUID = msg.nSrcUID
  242. szMsgData.tHeroData = msg.tHeroData
  243. InnerMsg.sendMsg(nSrcFD, szMsgData)
  244. end
  245. function LW_WARREPORT_GET_COMBATINFO(fd, msg)
  246. local nDesServerID = msg.nDesServerID
  247. local nDesFD = MiddleManager.getFDBySvrIndex(nDesServerID)
  248. --local nSrcFD = MiddleManager.getFDBySvrIndex(msg.nSrcServerID)
  249. if not nDesFD then
  250. print("[LW_WARREPORT_GET_COMBATINFO] 不存在对应的fd nDesServerID = "..nDesServerID.." nSrcServerID = "..msg.nSrcServerID)
  251. return
  252. end
  253. local tMsgData = InnerMsg.wl.WL_WARREPORT_GET_COMBATINFO
  254. tMsgData.nSrcUID = msg.nSrcUID
  255. tMsgData.type = msg.type
  256. tMsgData.id = msg.id
  257. tMsgData.nSrcServerID = msg.nSrcServerID
  258. tMsgData.mode = msg.mode
  259. InnerMsg.sendMsg(nDesFD, tMsgData)
  260. end
  261. function LW_WARREPORT_SEND_COMBATINFO(fd, msg)
  262. local nSrcServerID = msg.nSrcServerID
  263. local nSrcFD = MiddleManager.getFDBySvrIndex(nSrcServerID)
  264. if not nSrcFD then
  265. print("[LW_MIDDLE_CHAT_GET_HERO_DATA] 不存在对应的fd nSrcServerID = "..nSrcServerID)
  266. return
  267. end
  268. local tMsgData = InnerMsg.wl.WL_WARREPORT_SEND_COMBATINFO
  269. tMsgData.nSrcUID = msg.nSrcUID
  270. tMsgData.combatInfo = msg.combatInfo
  271. tMsgData.mode = msg.mode
  272. InnerMsg.sendMsg(nSrcFD, tMsgData)
  273. end
  274. -------------------- 跨服玩家头像数据开始 --------------------
  275. function LW_CHAT_PLAYER_INFO(fd, msg)
  276. local nDesFD = MiddleManager.getFDBySvrIndex(msg.nDesServerID)
  277. if not nDesFD then
  278. print("[LW_CHAT_PLAYER_INFO] 不存在对应的fd nDesServerID = "..msg.nDesServerID.." nSrcServerID = "..msg.nSrcServerID)
  279. return
  280. end
  281. local tMsgData = InnerMsg.wl.WL_CHAT_PLAYER_INFO
  282. tMsgData.nSrcUID = msg.nSrcUID
  283. tMsgData.nDesUID = msg.nDesUID
  284. tMsgData.nSrcServerID = msg.nSrcServerID
  285. InnerMsg.sendMsg(nDesFD, tMsgData)
  286. end
  287. function LW_CHAT_PLAYER_INFO_SEND(fd, msg)
  288. local nSrcFD = MiddleManager.getFDBySvrIndex(msg.nSrcServerID)
  289. if not nSrcFD then
  290. print("[LW_CHAT_PLAYER_INFO_SEND] 不存在对应的fd nSrcServerID = "..msg.nSrcServerID)
  291. return
  292. end
  293. local tMsgData = InnerMsg.wl.WL_CHAT_PLAYER_INFO_SEND
  294. tMsgData.nSrcUID = msg.nSrcUID
  295. tMsgData.tData = msg.tData
  296. InnerMsg.sendMsg(nSrcFD, tMsgData)
  297. end
  298. -------------------- 跨服玩家头像数据结束 --------------------
  299. -------------------- 跨服请求战斗数据开始 --------------------
  300. function LW_COMBAT_GETINFO(fd, msg)
  301. local nDesFD = MiddleManager.getFDBySvrIndex(msg.nDesServerID)
  302. if not nDesFD then
  303. print("[LW_COMBAT_QIECUO_GETINFO] 不存在对应的fd nDesServerID = "..msg.nDesServerID.." nSrcServerID = "..msg.nSrcServerID)
  304. return
  305. end
  306. print("[LW_COMBAT_GETINFO] 收到")
  307. local tMsgData = InnerMsg.wl.WL_COMBAT_GETINFO
  308. tMsgData.nSrcUID = msg.nSrcUID
  309. tMsgData.nDesUID = msg.nDesUID
  310. tMsgData.nSrcServerID = msg.nSrcServerID
  311. tMsgData.nCombatType = msg.nCombatType
  312. InnerMsg.sendMsg(nDesFD, tMsgData)
  313. print("[LW_COMBAT_GETINFO] 发送 WL_COMBAT_QIECUO_GETINFO")
  314. end
  315. function LW_COMBAT_GETINFO_SEND(fd, msg)
  316. local nSrcFD = MiddleManager.getFDBySvrIndex(msg.nSrcServerID)
  317. if not nSrcFD then
  318. print("[LW_COMBAT_GETINFO_SEND] 不存在对应的fd nSrcServerID = "..msg.nSrcServerID)
  319. return
  320. end
  321. print("[LW_COMBAT_GETINFO_SEND] 收到")
  322. local tMsgData = InnerMsg.wl.WL_COMBAT_GETINFO_SEND
  323. tMsgData.nResult = msg.nResult
  324. tMsgData.nSrcUID = msg.nSrcUID
  325. tMsgData.tObjList = msg.tObjList
  326. tMsgData.tHelpList = msg.tHelpList
  327. tMsgData.tRoleBase = msg.tRoleBase
  328. tMsgData.formation = msg.formation
  329. tMsgData.tJiBan = msg.tJiBan
  330. InnerMsg.sendMsg(nSrcFD, tMsgData)
  331. print("[LW_COMBAT_GETINFO_SEND] 发送 WL_COMBAT_GETINFO_SEND")
  332. end
  333. -------------------- 跨服请求战斗数据结束 --------------------