miduo_client/Assets/ManagedResources/~Lua/Logic/Network.lua

340 lines
11 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

require "Message/CommonProto_pb"
require "Message/MessageTypeProto_pb"
require "Base/Queue"
Network = {}
Network.__index = Network
function Network.New(type, socket)
local instance = { type = type, socket = socket }
instance.isConnected = false
instance.waitingTimes = 0 --空闲时间
instance.maxWaitingTimes = 20 -- 最大心跳等待时间(秒)
instance.bIsStartListenHeartBeat = false
instance.resendTimes = 0 --记录消息重发次数
instance.sendFlag = false --监听收到消息的标记发送时标记为true收到消息则标记为false
instance.maxResendTimes = 3 --最大重发次数,超过该时间则取消发送
instance.sendWaitTime = 0 --记录消息等待时间(秒)
instance.maxSendWaitTime = 5 --消息重发等待时间(秒),超过该时间会重发消息
instance.sendFunc = nil --请求缓存
instance.sendFuncQueue = Queue.New() --请求缓存列表,当一帧发送多个请求时,缓存等待上一个请求收到回调时,执行下一个请求
instance.re_resendTimes = 0 --记录断线重发次数
instance.reconnectFlag = false --记录断线重连标记
instance.re_maxResendTimes = 2 --最大断线重发次数,超过该时间则取消发送
instance.re_sendWaitTime = 0 --记录断线等待时间(秒)
instance.re_maxSendWaitTime = 5 --消息断线重发等待时间(秒),超过该时间会重连
instance.ReconnectTime=0 -- 重连的发生时间
setmetatable(instance, Network)
return instance
end
function Network:Start()
UpdateBeat:Add(self.Update, self)
end
--卸载网络监听--
function Network:Unload()
UpdateBeat:Remove(self.Update, self)
end
--当连接建立时--
function Network:OnConnect()
self.isConnected = true
self.bIsStartListenHeartBeat = true
Game.GlobalEvent:DispatchEvent(Protocal.Connect, self)
end
--异常断线--
function Network:OnException()
SysPanel.ShowOne(Language[12110], function()
Game.Logout()
end)
self.bIsStartListenHeartBeat = false
Game.GlobalEvent:DispatchEvent(Protocal.Exception, self)
end
--连接中断,或者被踢掉--
function Network:OnDisconnect(err)
self.reconnectFlag = true
self.isConnected = false
self.bIsStartListenHeartBeat = false
Game.GlobalEvent:DispatchEvent(Protocal.Disconnect, self)
RequestPanel.Show(Language[12111])--..err)
self.socket:TryReconnect()
self.ReconnectTime= Time.time
end
function Network:SendClientHeartBeat()
--Log("-------SendClientHeartBeat-----")
self.socket:SendHeartBeat()
end
function Network:ReceiveClientHeartBeat(buffer)
local time = buffer:ReadIntToByte()
-- Log("-------ReceiveClientHeartBeat----- time: "..time)
Game.GlobalEvent:DispatchEvent(GameEvent.Network.OnReceiveHeartBeat, self, time)
end
--重新建立socket连接回调lua方法
function Network:OnReconnect()
RequestPanel.Hide()
RequestPanel.Show(Language[12112])
self.re_resendTimes = 0
self.reconnectFlag = false
self.socket:SendMessageWithCallBack(MessageTypeProto_pb.RECONNECT_REQUEST, MessageTypeProto_pb.RECONNECT_RESPONSE, nil, function(b)
Log("已经重连!!")
RequestPanel.Hide()
self.isConnected = true
self.bIsStartListenHeartBeat = true
Game.GlobalEvent:DispatchEvent(Protocal.Connect, self)
end)
coroutine.start(function()
coroutine.wait(2)
if not self.isConnected then
Log("没有收到 重连信息,重新设置链接!!")
self.socket:Disconnect("no reconnect msg, reset socket!!")
end
end)
end
function Network:Reset()
self.isConnected = false
self.re_resendTimes = 0
self.reconnectFlag = false
end
function Network:OnConnectFail()
RequestPanel.Hide()
SysPanel.ShowOne(Language[12113])
end
--重连3次失败
function Network:OnReconnectFail()
-- 重连时间超过2分钟强制回到登录界面
if Time.time - self.ReconnectTime > 60 then
--SysPanel.ShowTwo(Language[12235], function()
Game.Logout()
--end, Language[12117])
end
self.re_resendTimes = self.re_resendTimes + 1
if self.re_resendTimes > self.re_maxResendTimes then
RequestPanel.Hide()
SysPanel.ShowTwo(Language[12114], function()
Game.Logout()
end, function()
if self.isConnected then
PopupTipPanel.ShowTip(Language[12115])
else
RequestPanel.Show(Language[12116])
self.re_sendWaitTime = 0
self.re_resendTimes = 0
end
end, Language[12117])
end
end
-- 发送消息
function Network:SendMessage(nMsgId, sMsg)
local buffer = ByteBuffer.New()
if sMsg then
buffer:WriteBuffer(sMsg)
end
MyPCall(function()
self.socket:SendMessage(nMsgId, buffer)
end)
end
function Network:SendMessageWithCallBack(nMsgId, nReMsgId, sMsg, func, isHideMask)
if not isHideMask then
RequestPanel.Show(Language[12118])
end
self.sendFuncQueue:Enqueue(function()
local buffer = ByteBuffer.New()
if sMsg then
buffer:WriteBuffer(sMsg)
end
self:SetSending(true)
self.sendWaitTime = 0
if not isHideMask then
RequestPanel.Show(self.resendTimes > 0 and Language[12119] or Language[12118])
end
--Log("-------SendMessage-----msgId:"..nMsgId)
self.socket:SendMessageWithCallBack(nMsgId, nReMsgId, buffer, function(b)
--Log("-------ReceiveMessage-----msgId:"..nReMsgId)
self:SetSending(false)
self.resendTimes = 0
if self.sendFuncQueue.size > 0 then
self.sendFuncQueue:Dequeue()
end
--waitingTimes = 0
if func then
func(b)
end
if not isHideMask then
--该参数为空时,会在请求时显示全屏遮罩,防止误点击
RequestPanel.Hide()
end
end)
end)
end
function Network:ReceiveErrorInfo(buffer)
local data = buffer:DataByte()
local msg = CommonProto_pb.ErrorResponse()
msg:ParseFromString(data)
self:SetSending(false)
self.resendTimes = 0
if self.sendFuncQueue.size > 0 then
self.sendFuncQueue:Dequeue()
end
--waitingTimes = 0
RequestPanel.Hide()
-- 登录过程中报错
LoadingPanel.ErrorStep(msg)
LogError("Network ReceiveErrorInfo errCode"..msg.errCode)
--Log("msg.errCode:" .. msg.errCode)
--Log("msg.errMsg:" .. msg.errMsg)
--for i=1,#msg.errParams do
-- Log("msg.errParams:" .. msg.errParams[i])
--end
if (msg.errCode == 20000) then
if (msg.errMsg == Language[11507]) then
IndicationManager.canPopUpBagMaxMessage = true
elseif (msg.errMsg == Language[11508]) then
IndicationManager.getRewardFromMailMessage = true
else
PopupTipPanel.ShowTip(msg.errMsg)
end
return
end
if msg.errCode == -1 then
LogError("Network ReceiveErrorInfo errDes"..msg.errMsg)
end
local desc, title = self:GetErrorTip(msg)
if msg.errCode == -101 or msg.errCode == -102 or msg.errCode == -103 then
if(Time.time- self.ReconnectTime<10)then
return
end
--被顶号或者被封号
Game.Logout()
AppConst.Code = desc--TODO:重登会重置所有lua变量信息用一个不用的C#变量记录,用于记录异常退出信息
return
end
if desc then
if title then
SysPanel.ShowOne(desc, nil, nil, title)
else
PopupTipPanel.ShowTip(desc)
end
else
PopupTipPanel.ShowTip(msg.errMsg)
end
end
function Network:GetErrorTip(msg)
local errorCfg = ConfigManager.TryGetConfigData(ConfigName.ErrorCodeHint, msg.errCode)
if errorCfg then
local params = {}
for i = 1, #msg.errParams do
table.insert(params, GetLanguageStrById(msg.errParams[i]))
end
if errorCfg.ShowType == 1 then --tips
return string.format(GetLanguageStrById(errorCfg.Desc), unpack(params))
elseif errorCfg.ShowType == 2 then --弹窗
local contexts = string.split(GetLanguageStrById(errorCfg.Desc), "#") --标题#内容
return string.format(contexts[2], unpack(params)), contexts[1]
end
end
return msg.errMsg
end
--注册消息模块
function Network:RegisterMessage(nMsgId, pMessageHandle)
self.socket:RegistNetMessage(nMsgId, pMessageHandle)
end
function Network:UnRegisterMessage(nMsgId, pMessageHandle)
self.socket:UnregistNetMessage(nMsgId, pMessageHandle)
end
-- 设置发送状态
function Network:SetSending(isSending)
self.sendFlag = isSending
end
function Network:IsSending()
return self.sendFlag
end
function Network:Update()
if self.reconnectFlag and self.re_resendTimes <= self.re_maxResendTimes then
self.re_sendWaitTime = self.re_sendWaitTime + Time.fixedDeltaTime
if self.re_sendWaitTime > self.re_maxSendWaitTime then
RequestPanel.Show(Language[12120])
self.socket:TryReconnect()
self.re_sendWaitTime = 0
end
end
if not self.isConnected then
return
end
local dt = Time.fixedDeltaTime
if self.bIsStartListenHeartBeat then
self.waitingTimes = self.waitingTimes + dt
if self.waitingTimes > self.maxWaitingTimes then
self:SendClientHeartBeat()
self.waitingTimes = 0
end
end
if self:IsSending() then
self.sendWaitTime = self.sendWaitTime + dt
if self.sendWaitTime > self.maxSendWaitTime then
if self.resendTimes < self.maxResendTimes then
--logError("重发次数 :: " .. self.resendTimes)
MyPCall(self.sendFunc)
elseif self.resendTimes == self.maxResendTimes then
RequestPanel.Hide()
-- SysPanel.ShowTwo(Language[12121], function()
-- Game.Logout()
-- end, function()
-- -- if self:IsSending() then
-- self:SetSending(false)
-- self.resendTimes = 0
-- self.sendFuncQueue:Clear()
-- -- end
-- end, Language[12117])
Game.Logout()
end
self.resendTimes = self.resendTimes + 1
end
else
if self.sendFuncQueue.size > 0 then
self.sendFunc = self.sendFuncQueue:Peek()
MyPCall(self.sendFunc)
end
end
end