Files

206 lines
4.9 KiB
Lua
Raw Permalink Normal View History

2025-01-25 04:38:09 +08:00
local Network = {}
local pb = require("pb")
local CSNetworker = CS.Thousandto.Plugins.Common.Networker
--存储所有的服务器响应事件【key:消息id(enum)value:事件】一个消息只能创建一个响应事件
local msgMap = {}
--根据枚举存储所有类型
local cmdMap = {}
--根据类型存储所有枚举
local msgIDMap = {}
--是否是重新注册消息
local isReRegisterMsg = false
--注册接收的消息
local resMsgIDs = nil
local resMsgIDDic = nil
local resExtendMsgIDs = nil
local resExtendMsgIDDic = nil
--创建服务器消息响应事件
function Network.CreatRespond(cmd, callback)
if not cmd or not callback then
Debug.LogError(string.format("注册消息错误 cmd = %s,callback = %s", cmd, callback))
return
end
local _msgid = pb.enum(string.format("%s.MsgID", cmd), "eMsgID")
if not _msgid then
Debug.LogError(string.format("消息不存在,请手动删除 %s", cmd))
return
end
if msgMap[_msgid] and not isReRegisterMsg then
Debug.LogError(string.format("消息重复注册 cmd = %s", cmd))
return
end
if _msgid <= 500000 then
--50万以内并且不在注册列表的消息不走lua协议处理
if resMsgIDs == nil then
Network.GetResLuaMsgIDs()
end
--注册lua扩展的消息
if resExtendMsgIDs == nil then
Network.GetResLuaExtendMsgIDs()
end
if resMsgIDDic[_msgid] == nil and resExtendMsgIDDic[_msgid] == nil then
return
end
end
msgMap[_msgid] = callback
cmdMap[_msgid] = cmd
msgIDMap[cmd] = _msgid
end
--发送消息【编码-->序列化-->发送】
function Network.Send(cmd, msg)
msg = msg or {}
if not cmd then
Debug.LogError(string.format("注册消息错误 cmd = %s", cmd))
return
end
if not msgIDMap[cmd] then
msgIDMap[cmd] = pb.enum(string.format("%s.MsgID", cmd), "eMsgID")
if not msgIDMap[cmd] then
Debug.LogError(string.format("消息不存在: %s",cmd))
return
end
end
local _code = pb.encode(cmd, msg)
CSNetworker.Instance:Send(_code, msgIDMap[cmd])
end
--处理服务器发来的消息
function Network.DoResMessage(msgid, bytes)
local _cmd = cmdMap[msgid]
if not _cmd then
Debug.LogError(string.format("msgid = %s 消息未注册", msgid))
return
end
local _msg = pb.decode(_cmd, bytes)
--存一个MsgID
_msg.MsgID = msgid
msgMap[msgid](_msg)
-- local _ok, _err = xpcall(function() msgMap[cmd](_msg) end, debug.traceback)
-- if not _ok then
-- end
end
--本地模拟服务器
function Network.DoResTest(cmd, table)
local msgid = msgIDMap[cmd]
if not msgid then
Debug.LogError(string.format("msgid = %s 消息未注册", msgid))
return
end
table.MsgID = msgid
msgMap[msgid](table)
end
--获取所有Lua端的消息ID
function Network.GetResLuaMsgIDs()
if resMsgIDs == nil then
local resMsgCMDs = require("Network.ResMsgCMD")
resMsgIDs = {}
resMsgIDDic = {}
for i=1, #resMsgCMDs do
local _msgID = pb.enum(string.format("%s.MsgID", resMsgCMDs[i]), "eMsgID")
if _msgID ~= nil then
table.insert(resMsgIDs,_msgID )
resMsgIDDic[_msgID] = true
end
end
end
return resMsgIDs
end
--获取所有Lua端扩展的消息ID
function Network.GetResLuaExtendMsgIDs()
if resExtendMsgIDs == nil then
local resMsgCMDs = require("Network.ResMsgExtendCMD")
resExtendMsgIDs = {}
resExtendMsgIDDic = {}
for i=1, #resMsgCMDs do
local _msgID = pb.enum(string.format("%s.MsgID", resMsgCMDs[i]), "eMsgID")
if _msgID ~= nil then
table.insert(resExtendMsgIDs,_msgID )
resExtendMsgIDDic[_msgID] = true
end
end
end
return resExtendMsgIDs
end
function Network.ReRegisterMsg(name)
local _path = string.format("Network.Msg.%s", name)
Utils.RemoveRequiredByName(_path)
local _msgSystem = require(_path)
if _msgSystem then
isReRegisterMsg = true
_msgSystem.RegisterMsg()
isReRegisterMsg = false
end
end
--注册所有消息
function Network.RegisterAllMsg()
local _msgNames = require("Network.Msg.ResMsg.MsgNames")
for i=1, #_msgNames do
local _msgSystem = require(string.format("Network/Msg/ResMsg/%s", _msgNames[i]))
if _msgSystem then
_msgSystem.RegisterMsg()
end
end
end
--初始化
function Network.Init()
--加载所有协议文件
local protoPaths = CSNetworker.GetAllProtoPath()
local _count = protoPaths.Count - 1
-- 打印pb的类型
print(pb.types())
for i = 0, _count do
local _path = protoPaths[i]
local _isok = pb.load(_path)
end
Network.RegisterAllMsg()
end
function Network.GetMsgID(cmd)
return pb.enum(string.format("%s.MsgID", cmd), "eMsgID")
end
--设置IP和端口
function Network.GetIPAndPort()
return CSNetworker.Instance.IP,CSNetworker.Instance.Port;
end
--设置IP和端口
function Network.SetIPAndPort(ip,port)
CSNetworker.Instance.IP = ip;
CSNetworker.Instance.Port = port;
end
--连接
function Network.Connect(func)
CSNetworker.Instance:Connect(func);
end
--断开连接
function Network.Disconnect()
CSNetworker.Instance:Disconnect();
end
--开始线程
function Network.StartThread()
CSNetworker.Instance:StartThread();
end
return Network