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