| | |
| | | def SetConnState(self, connState): self._connState = connState
|
| | | def GetHeartCurTime(self): return self._heartCurTime # 上次收到该服心跳时的本服时间戳
|
| | | def SetHeartCurTime(self, curTime): self._heartCurTime = curTime
|
| | | def IsServerOpen(self):
|
| | | ## 是否正常开放中
|
| | | |
| | | # 验证连接状态
|
| | | if self._connState != ShareDefine.ssConn_Normal:
|
| | | return False
|
| | | |
| | | # 验证维护状态
|
| | | |
| | | return True
|
| | |
|
| | | class SSServerMgr():
|
| | | ## 其他服务器管理器,所有服务器通用
|
| | |
| | | def DoHeartbeat(self, curTime):
|
| | | ## 心跳广播给其他服
|
| | |
|
| | | if not GameWorld.IsCrossServer():
|
| | | # 目前仅跨服服务器需要处理心跳广播 ,其他暂时不用
|
| | | return
|
| | | |
| | | # 时间回调时也立刻同步心跳
|
| | | if self._heartTime and curTime >= self._heartTime and curTime - self._heartTime < HeartBreat:
|
| | | #GameWorld.DebugLog("不广播心跳! self._heartTime=%s,curTime=%s,diff=%s" % (self._heartTime, curTime, curTime - self._heartTime))
|
| | | return
|
| | | self._heartTime = curTime
|
| | | |
| | | if not GameWorld.IsCrossServer():
|
| | | # 目前仅跨服服务器需要处理心跳,其他暂时不用
|
| | | return
|
| | | #GameWorld.DebugLog("广播心跳! self._heartTime=%s,%s" % (self._heartTime, GameWorld.ChangeTimeNumToStr(self._heartTime)))
|
| | |
|
| | | pack = ChServerToServerPyPack.tagSSHeart()
|
| | | pack.ServerID = GameWorld.GetGameWorld().GetServerID()
|
| | |
| | | curTime = int(time.time())
|
| | |
|
| | | ssServer = self.GetSSServer(serverID)
|
| | | ssServer.SetServerType(serverType)
|
| | | ssServer.SetHeartCurTime(curTime)
|
| | |
|
| | | befConnState = ssServer.GetConnState()
|
| | |
|
| | | ssServer.SetServerType(serverType)
|
| | | ssServer.SetConnState(ShareDefine.ssConn_Normal)
|
| | | ssServer.SetHeartCurTime(curTime)
|
| | | # 目标是跨服中心,更新跨服时间
|
| | | if serverType == ShareDefine.serverType_CrossCenter:
|
| | | if not self._crossCenterID:
|
| | | self._crossCenterID = serverID
|
| | | |
| | | updCrossTime = serverTime
|
| | | curCrossTime = self.GetCrossTime()
|
| | | self.SetCrossTime(updCrossTime, curTime)
|
| | | diffSeconds = updCrossTime - curCrossTime # 误差秒
|
| | | #GameWorld.DebugLog("curCrossTime=%s" % GameWorld.ChangeTimeNumToStr(curCrossTime))
|
| | | #GameWorld.DebugLog("updCrossTime=%s" % GameWorld.ChangeTimeNumToStr(updCrossTime))
|
| | | #GameWorld.DebugLog("与跨服时间误差=%s" % diffSeconds)
|
| | | if abs(diffSeconds) >= 30:
|
| | | GameWorld.Log("本服的跨服时间与跨服实际时间误差过大同步前端! diffSeconds=%s" % diffSeconds)
|
| | | GameWorld.Log("curCrossTime=%s" % GameWorld.ChangeTimeNumToStr(curCrossTime))
|
| | | GameWorld.Log("updCrossTime=%s" % GameWorld.ChangeTimeNumToStr(updCrossTime))
|
| | | ChPlayer.Sync_PyServerDataTimeToClient()
|
| | | |
| | | if befConnState == ShareDefine.ssConn_Normal:
|
| | | #GameWorld.Log("收到目标跨服服务器心跳,正常连接中: crossServerID=%s,crossServerTime=%s" % (serverID, GameWorld.ChangeTimeNumToStr(serverTime)))
|
| | | return
|
| | |
|
| | | ssServer.SetConnState(ShareDefine.ssConn_Normal)
|
| | | isReconn = True if befConnState == ShareDefine.ssConn_Disconnected else False
|
| | |
|
| | | # 跨服服务器
|
| | | if serverType == ShareDefine.serverType_CrossCenter:
|
| | | GameWorld.Log("连上跨服中心服务器: crossServerID=%s,isReconn=%s,crossServerTime=%s" % (serverID, isReconn, GameWorld.ChangeTimeNumToStr(serverTime)))
|
| | | if not self._crossCenterID:
|
| | | self._crossCenterID = serverID
|
| | | if serverID not in self._crossServerIDList:
|
| | | self._crossServerIDList.append(serverID)
|
| | | |
| | | lastCrossTime = self.GetCrossTime()
|
| | | self.SetCrossTime(serverTime, curTime)
|
| | | |
| | | # 时间回调或误差过大立即同步给前端
|
| | | if serverTime < lastCrossTime or (serverTime - lastCrossTime) >= 30:
|
| | | ChPlayer.Sync_PyServerDataTimeToClient()
|
| | | |
| | | elif serverType == ShareDefine.serverType_Cross:
|
| | | GameWorld.Log("连上跨服服务器: crossServerID=%s,isReconn=%s" % (serverID, isReconn))
|
| | | if serverType in [ShareDefine.serverType_CrossCenter, ShareDefine.serverType_Cross]:
|
| | | if serverType == ShareDefine.serverType_CrossCenter:
|
| | | GameWorld.Log("连上跨服中心服务器: crossServerID=%s,isReconn=%s,crossServerTime=%s" % (serverID, isReconn, GameWorld.ChangeTimeNumToStr(serverTime)))
|
| | | elif serverType == ShareDefine.serverType_Cross:
|
| | | GameWorld.Log("连上常规跨服服务器: crossServerID=%s,isReconn=%s" % (serverID, isReconn))
|
| | | if serverID not in self._crossServerIDList:
|
| | | self._crossServerIDList.append(serverID)
|
| | |
|
| | |
| | | ## 获取跨服服务器时间 - 以跨服中心服务器为准,如果没有默认取本服时间
|
| | | curTime = int(time.time())
|
| | | if not self._crossTime:
|
| | | #GameWorld.DebugLog("没有跨服时间,直接返回本服时间")
|
| | | return curTime
|
| | | self._crossTime += max(0, curTime - self._crossTimeCurTime)
|
| | | self._crossTimeCurTime = curTime
|
| | |
| | | self._crossTimeCurTime = curTime if curTime else int(time.time())
|
| | | return serverTime
|
| | |
|
| | | def GetCrossServerIDList(self): return self._crossServerIDList
|
| | | def GetCrossCenterID(self): return self._crossCenterID # 跨服中心服务器ID
|
| | | def GetCrossServerIDList(self): return self._crossServerIDList # 所有运行中的跨服服务器ID,包含跨服中心
|
| | |
|
| | | def CheckSSServerDisconnected(self, curTime):
|
| | | ## 检查其他服是否断开连接
|
| | |
| | | # 本服时间回调了暂不处理
|
| | | continue
|
| | | if curTime - lastHeartTime <= DisconnectedTime:
|
| | | #GameWorld.Log("检查断开时为正常连接中: serverID=%s,serverType=%s,pass=%s" % (ssServer.GetServerID(), ssServer.GetServerType(), curTime - lastHeartTime))
|
| | | continue
|
| | | ssServer.SetConnState(ShareDefine.ssConn_Disconnected)
|
| | |
|