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

299 lines
9.7 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 --消息断线重发等待时间(秒),超过该时间会重连
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()
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()
-- Log("-------ReceiveClientHeartBeat----- time: "..time)
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()
end, function()
if self.isConnected then
PopupTipPanel.ShowTip("重连成功!")
else
RequestPanel.Show("正在请求重连")
self.re_sendWaitTime = 0
self.re_resendTimes = 0
end
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:SetSending(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: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 == "背包已满,其余奖励将通过邮件发送") then
IndicationManager.canPopUpBagMaxMessage = true
elseif (msg.errMsg == "背包已满") 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 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])
else
PopupTipPanel.ShowTip(msg.errMsg)
end
else
if msg.errCode == -101 or msg.errCode == -102 then
--被顶号或者被封号
Game.Logout()
AppConst.Code = msg.errMsg --TODO:重登会重置所有lua变量信息用一个不用的C#变量记录,用于记录异常退出信息
else
PopupTipPanel.ShowTip(msg.errMsg)
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: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("网络不给力,正在请求重连")
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()
MsgPanel.ShowTwo("请求失败,请再次尝试!", function()
Game.Logout()
end, function()
-- if self:IsSending() then
self:SetSending(false)
self.resendTimes = 0
self.sendFuncQueue:Clear()
-- end
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