HomeServer/lualib-src/Server-main/Start.lua
2024-11-20 15:41:37 +08:00

244 lines
6.9 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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