HomeServer/lualib-src/Server-main/Start.lua

244 lines
6.9 KiB
Lua
Raw Permalink Normal View History

2024-11-20 15:41:09 +08:00
local skynet = require "skynet"
require "skynet.manager"
skynet.server = {}
require "Include"
local json =require "json"
local gameCmd = require "GameCmd"
local log = require "Log"
local errorInfo = require "ErrorInfo"
local cluster = require "skynet.cluster"
local socket = require "skynet.socket"
local pb = require "pb"
local redis = require "skynet.db.redis"
local redisKeyUrl = require "RedisKeyUrl"
local serverId = tonumber(skynet.getenv "serverId")
local clusterServer = require "ClusterServer"
local db = require "DB"
--AES 04169967a0dda41831aae37ae5f7c37a
--接收HTTP消息
function skynet.StartRecv()
skynet.register("StartServer")
skynet.dispatch("lua", function (_,_, cmd, ...)
if "TcpMsg" == cmd then --Tcp消息
local c2sData = ...
local isDo,s2cData = false,nil
s2cData = skynet.server.tcpServer:ClusterRecv( c2sData )
local sendMsg,sendLen = skynet.pack(s2cData)
skynet.ret(sendMsg,sendLen)
--[[
function Do( c2sData )
s2cData = skynet.server.tcpServer:ClusterRecv( c2sData )
return s2cData
end
isDo,s2cData = pcall(Do, c2sData )
local sendMsg,sendLen = 0,0
if isDo then
sendMsg,sendLen = skynet.pack(s2cData)
else
log.info("StartServer TcpMsg内部错误信息",s2cData)
s2cData ={}
s2cData.code = errorInfo.ErrorCode.InnerError
sendMsg,sendLen = skynet.pack(s2cData)
end
--返回去
skynet.ret(sendMsg,sendLen)
]]
elseif "HttpMsg" == cmd then --Http消息
local id ,url , c2sData , addr ,header= ...
--对接收到消息进行处理
local isDo,s2cData = false,nil
function Do(url ,c2sData , addr)
--获取IP地址
local pos = string.find(addr,":")
addr = string.sub(addr,1,pos - 1)
c2sData = json:decode(c2sData)
s2cData = skynet.server.httpServer:Recv(url, c2sData , addr , header)
return s2cData
end
--pcall调用一下有异常直接返回
isDo,s2cData = pcall(Do,url ,c2sData , addr , header)
local sendMsg,sendLen = 0,0
if isDo then
sendMsg,sendLen = skynet.pack(s2cData)
else
log.info("StartServer HttpMsg内部错误信息",s2cData)
s2cData ={}
s2cData.code = errorInfo.ErrorCode.InnerError
s2cData = json:encode(s2cData)
sendMsg,sendLen = skynet.pack(s2cData)
end
--返回去
skynet.ret(sendMsg,sendLen)
elseif "ClusterMsg" == cmd then --集群消息
local sendMsg,sendLen = 0,0
sendMsg,sendLen = skynet.pack(clusterServer:ClusterRecv(...))
skynet.ret(sendMsg,sendLen)
end
end)
end
--初始化各种模块
function skynet.Init()
skynet.newservice("Logger")
local isOk = true
--载入游戏需要的配置文件
skynet.server.gameConfig:LoadConfig()
skynet.server.gameConfig:LoadJson()
skynet.server.gameConfig:LoadProto()
skynet.AddTime = 0
skynet.ServerID = serverId
skynet.ServerName = clusterServer:GetServerTypeName( serverId )
--redis连接
local redisCfg =
{
host = skynet.server.gameConfig.RedisConfig.host ,
port = skynet.server.gameConfig.RedisConfig.port ,
db = 0,
auth = skynet.server.gameConfig.RedisConfig.password
}
--游戏服建立多条redis连接
skynet.server.redis = redis.connect(redisCfg)
if not skynet.server.redis then
log.info("连接Redis数据库失败")
return false
else
log.info(string.format("Redis 数据库连接成功 信息 IP地址 %s 端口 %s" ,redisCfg.host , redisCfg.port))
end
--游戏服可以连接多个数据库
skynet.InitDB()
--先初始化clusterServer ,再初始其它模块
skynet.server.clusterServer:Init()
for key, value in pairs(skynet.server) do
if "redis" ~= key and "clusterServer" ~= key and value.Init then
value:Init()
end
end
log.info("程序模块初始化完成")
--获取当前服务器IP信息
local cfgServer = skynet.server.common:GetClusterConfig( serverId )
if not cfgServer then
log.info("当前获取集群配置出错1 ",serverId)
return false
end
log.info("获取当前服务器配置完成")
--http底层加载
if "" ~= cfgServer.httpPort then
skynet.server.HttpSocket = skynet.newservice("HttpSocket", "0.0.0.0" , cfgServer.httpPort)
end
--登陆服和游戏服不绑定TCP端口
if "" ~= cfgServer.tcpPort then
skynet.server.TcpSocket = skynet.newservice("TcpSocket", "0.0.0.0" , cfgServer.tcpPort)
end
skynet.server.recordTime = skynet.GetTime()
log.info("Http模块初始化完成")
--通过配置获取的节点进行组装
local clusterList = {}
local serverName = ""
for k, v in pairs(skynet.server.gameConfig.ClusterServerConfig) do
serverName = clusterServer:GetServerTypeClusterName( v.serverId )
clusterList[ serverName ] = string.format("%s:%s",v.internalIp ,v.clusterPort)
end
--载入集群
local clusterName = clusterServer:GetServerTypeClusterName( serverId )
cluster.reload(clusterList)
cluster.register(clusterName)
cluster.open(clusterName)
skynet.server.cluster = cluster
log.info("载入集群节点配置完成")
end
--主服务器
skynet.start(function()
skynet.StartRecv()
skynet.Init()
skynet.fork(skynet.Timer, 1000,500)
log.info("服务器成功开启")
--print(string.char(208,161,200))
end)
--初始化DB
function skynet.InitDB()
local isOk = true
local dbConfig = skynet.server.gameConfig.DBInfoConfig
local cfgAllClusterServer = skynet.server.gameConfig.ClusterServerConfig
local cfgOneServer = skynet.server.gameConfig:GetCurClusterServerCfg( serverId )
--分析要连接的数据库名
if "" ~= cfgOneServer.dbName then
local dbNameList = skynet.server.common:Split( cfgOneServer.dbName , "|")
for k, dbName in pairs( dbNameList ) do
isOk = skynet.server.db:Connect( dbConfig.host ,dbConfig.port ,dbConfig.user,dbConfig.password , dbName )
if not isOk then
return false
end
end
end
end
--Timer
function skynet.Timer(timerType , timeStamp)
local isSuc ,err = nil,nil
while true do
if 1000 == timerType then
--跨天
if not skynet.server.common:IsSameDay(skynet.GetTime() ,skynet.server.recordTime ) then
local str = string.format("服务器跨天 当前时间 %d 服务器记录时间 %d",skynet.GetTime() ,skynet.server.recordTime)
log.info(str)
--跨天TIMER
clusterServer:OnNewDay()
for key, value in pairs(skynet.server) do
if "table"== type(value) and value.OnNewDay and "redis" ~= key then
function Do(value)
value:OnNewDay()
end
isSuc,err = pcall(Do,value)
if not isSuc then
log.info("跨天TIMER有报错",timerType,key,err)
end
end
end
skynet.server.recordTime = skynet.GetTime()
end
--5秒TIMER
for key, value in pairs(skynet.server) do
if "table" == type(value) and value.On5SecTimer and "redis" ~= key then
function Do(value)
value:On5SecTimer()
end
isSuc,err = pcall(Do,value)
if not isSuc then
log.info("5秒TIMER有报错",timerType,key,err)
end
end
end
end
skynet.sleep(timeStamp)
end
end
--获取时间
function skynet.GetTime()
return os.time() + skynet.AddTime
end