local NetworkManager = {} local serverData = require("Config/ZConfigManager.lua"):GetConfig("configServer") local szServerIP = serverData[1].ip local iServerPort = serverData[1].szPort local fLastRecvTime local bConnecting = false local tblFlagToDispatcher = {} local function RecvlogicCoroutine() while true do require("Base/CoroutineHelper.lua"):Wait(0.1) local connectState = CS.LuaSocketManager.Update() if NetworkManager.connectState ~= connectState then Debugf("NetworkManager dispatch %d", connectState) local eventManager = require("Base/ZEventDispatchCenter.lua") eventManager:DispatchEvent(eventManager.EventType.NET_CONNECT_STATE, connectState) end NetworkManager.connectState = connectState if connectState ~= 0 then local eventManager = require("Base/ZEventDispatchCenter.lua") CS.ZLog.Log.Error(string.format("Net Disconnected with state %d", connectState)) eventManager:DispatchEvent(eventManager.EventType.NET_DISCONNECTED) NetworkManager:Disconnect() return end local msgPackage = CS.LuaSocketManager.RecvMessage() while msgPackage ~= nil and msgPackage.msgType and msgPackage.msgData do fLastRecvTime = os.time() CS.ZLog.Log.Debug(string.format("Serialization Flag %d", msgPackage.serializationFlag)) require("Base/Utils.lua"):PCallOrError(function() local dispatcher = tblFlagToDispatcher[msgPackage.serializationFlag] if dispatcher ~= nil then dispatcher.RecvData(msgPackage) else CS.ZLog.Log.Error(string.format( "Unknown serialization flag %d", msgPackage.dispatcher)) end end) msgPackage = CS.LuaSocketManager.RecvMessage() end end end function NetworkManager:GetLastRecvTime() return fLastRecvTime end function NetworkManager:IsConnecting() return bConnecting end function NetworkManager:SendData(msgType, bArrayMessage, bSerializationFlag, bCompressionFlag) return CS.LuaSocketManager.Send(msgType, bArrayMessage, bSerializationFlag, bCompressionFlag) end function NetworkManager:RegisterDispatcher(iFlag, dispatcher) if (dispatcher.RecvData == nil) then CS.ZLog.Log.Error(string.format( "Invalid dispatcher for flag %d", iFlag)) end tblFlagToDispatcher[iFlag] = dispatcher end function NetworkManager:Connect() if bConnecting then return end print("Connect", bConnecting) bConnecting = true NetworkManager.connectState = 0 CS.LuaSocketManager.Connect(szServerIP, iServerPort) fLastRecvTime = os.time() print("RecvTime", fLastRecvTime) self._recvlogicCoroutine = require("Base/CoroutineHelper.lua"):Start(RecvlogicCoroutine) end function NetworkManager:Disconnect() if not bConnecting then return; end bConnecting = false print("Disconnect") require("Base/CoroutineHelper.lua"):Stop(NetworkManager._recvlogicCoroutine) NetworkManager._recvlogicCoroutine = nil CS.LuaSocketManager.Disconnect() end function NetworkManager:Init() print("NetworkManager.Init~") self._c2s = require("Network/C2S.lua") self._s2c = require("Network/S2C.lua") self._eventManager = require("Base/ZEventDispatchCenter.lua") end function NetworkManager:UnInit() CS.LuaSocketManager.Disconnect() require("Base/CoroutineHelper.lua"):Stop(NetworkManager._recvlogicCoroutine) if NetworkManager._connectLogicCoroutine then require("Base/CoroutineHelper.lua"):Stop(NetworkManager._connectLogicCoroutine) end -- 心跳 if NetworkManager._heartBeatCorutine then require("Base/CoroutineHelper.lua"):Stop(NetworkManager._heartBeatCorutine) end nHeartBeat = 0 print("NetworkManager.UnInit ~") end function NetworkManager:RemoteCall(funcName, ... ) print("NetworkManager:RemoteCall funcName:", funcName, " param:", ...) self._c2s:RemoteCall(funcName, ...) end return NetworkManager