244 lines
6.9 KiB
Lua
244 lines
6.9 KiB
Lua
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 |