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

275 lines
9.1 KiB
Lua
Raw Normal View History

2020-05-09 13:31:21 +08:00
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 --消息断线重发等待时间(秒),超过该时间会重连
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()
MsgPanel.ShowOne("网络异常,请重新登录!", function()
Game.Logout()
2020-05-09 13:31:21 +08:00
end)
self.bIsStartListenHeartBeat = false
Game.GlobalEvent:DispatchEvent(Protocal.Exception, self)
end
--连接中断,或者被踢掉--
function Network:OnDisconnect()
self.reconnectFlag = true
self.isConnected = false
self.bIsStartListenHeartBeat = false
Game.GlobalEvent:DispatchEvent(Protocal.Disconnect, self)
RequestPanel.Show("您已掉线,正在请求重连")
self.socket:TryReconnect()
end
function Network:SendClientHeartBeat()
--Log("-------SendClientHeartBeat-----")
self.socket:SendHeartBeat()
end
function Network:ReceiveClientHeartBeat(buffer)
local time = buffer:ReadIntToByte()
2020-07-27 14:42:25 +08:00
-- Log("-------ReceiveClientHeartBeat----- time: "..time)
2020-05-09 13:31:21 +08:00
Game.GlobalEvent:DispatchEvent(GameEvent.Network.OnReceiveHeartBeat, self, time)
end
--重新建立socket连接回调lua方法
function Network:OnReconnect()
RequestPanel.Hide()
RequestPanel.Show("重连成功!等待服务器响应")
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)
end
function Network:Reset()
self.isConnected = false
self.re_resendTimes = 0
self.reconnectFlag = false
end
function Network:OnConnectFail()
RequestPanel.Hide()
MsgPanel.ShowOne("服务器维护中,请稍后尝试")
end
--重连3次失败
function Network:OnReconnectFail()
self.re_resendTimes = self.re_resendTimes + 1
if self.re_resendTimes > self.re_maxResendTimes then
RequestPanel.Hide()
MsgPanel.ShowTwo("重连失败,是否尝试重连?", function()
Game.Logout()
2020-05-09 13:31:21 +08:00
end, function()
RequestPanel.Show("正在请求重连")
self.re_sendWaitTime = 0
self.re_resendTimes = 0
end, "重新登录")
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("发送请求中")
end
self.sendFuncQueue:Enqueue(function()
local buffer = ByteBuffer.New()
if sMsg then
buffer:WriteBuffer(sMsg)
end
self.sendFlag = true
self.sendWaitTime = 0
if not isHideMask then
RequestPanel.Show(self.resendTimes > 0 and "网络不给力,正在重新发送请求" or "发送请求中")
end
--Log("-------SendMessage-----msgId:"..nMsgId)
self.socket:SendMessageWithCallBack(nMsgId, nReMsgId, buffer, function(b)
--Log("-------ReceiveMessage-----msgId:"..nReMsgId)
self.sendFlag = 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.sendFlag = false
self.resendTimes = 0
if self.sendFuncQueue.size > 0 then
self.sendFuncQueue:Dequeue()
end
--waitingTimes = 0
RequestPanel.Hide()
-- 登录过程中报错
LoadingPanel.ErrorStep(msg)
--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 == "背包已满,其余奖励将通过邮件发送") then
IndicationManager.canPopUpBagMaxMessage = true
elseif (msg.errMsg == "背包已满") then
IndicationManager.getRewardFromMailMessage = true
else
PopupTipPanel.ShowTip(msg.errMsg)
end
return
end
if msg.errCode == -1 then
Log("服务器发来的错误消息:"..msg.errMsg)
end
local errorCfg = ConfigManager.TryGetConfigData(ConfigName.ErrorCodeHint, msg.errCode)
if errorCfg then
if errorCfg.ShowType == 1 then --tips
PopupTipPanel.ShowTip(string.format(errorCfg.Desc, unpack(msg.errParams)))
elseif errorCfg.ShowType == 2 then --弹窗
local contexts = string.split(errorCfg.Desc, "#") --标题#内容
MsgPanel.ShowOne(string.format(contexts[2], unpack(msg.errParams)), nil, nil, contexts[1])
end
else
if msg.errCode == -101 or msg.errCode == -102 then
--被顶号或者被封号
Game.Logout()
2020-05-09 13:31:21 +08:00
AppConst.Code = msg.errMsg --TODO:重登会重置所有lua变量信息用一个不用的C#变量记录,用于记录异常退出信息
end
end
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: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("网络不给力,正在请求重连")
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.sendFlag 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()
MsgPanel.ShowTwo("请求失败,是否重新请求?", function()
Game.Logout()
2020-05-09 13:31:21 +08:00
end, function()
self.resendTimes = 0
end, "重新登录")
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