Ejemplo n.º 1
0
        private void RegisterGameServer(IRegisterGameServer request, IGameServerPeer peer, bool registerByRequet)
        {
            var key = GameServerContext.GetKey(request);

            if (log.IsInfoEnabled)
            {
                if (registerByRequet)
                {
                    log.Info($"Registering GS by request. key:'{key}', id:'{request.ServerId}', p:{peer}");
                }
                else
                {
                    log.Info($"Registering GS by InitRequest. key:'{key}', id:'{request.ServerId}', p:{peer}");
                }
            }

            lock (this.gameServerContexts)
            {
                ContextKeeper keeper;
                if (this.gameServerContexts.TryGetValue(key, out keeper))
                {
                    keeper.KillDisposeTimer();
                    if (keeper.Context.ServerId == request.ServerId)
                    {
                        if (log.IsInfoEnabled)
                        {
                            log.InfoFormat("Context for GS found and reused. key:'{0}', id:'{1}',p:{2}", key, request.ServerId, peer);
                        }

                        keeper.Context.AttachPeerAndHandleRegisterRequest(peer, request, true);
                        return;
                    }

                    if (log.IsDebugEnabled)
                    {
                        log.DebugFormat("Context for GS found but belongs to other server." +
                                        " key:'{0}', old_id:'{1}',new_id:{2}", key, keeper.Context.ServerId, request.ServerId);
                    }

                    this.RemoveContext(keeper.Context);
                    keeper.Context.DetachPeerAndClose();
                }

                keeper = new ContextKeeper
                {
                    Context = this.CreateContext(request),
                };

                keeper.Context.AttachPeerAndHandleRegisterRequest(peer, request, false);

                this.gameServerContexts.Add(key, keeper);

                if (log.IsInfoEnabled)
                {
                    log.InfoFormat("GS is added. key:'{0}', id:'{1}',p:{2}", key, request.ServerId, peer);
                }
                return;
            }
        }
Ejemplo n.º 2
0
        public void AttachPeerAndHandleRegisterRequest(IGameServerPeer peer, IRegisterGameServer request, bool reconnect)
        {
            this.AttachPeer(peer);
            this.SetStateAndLoadPrediction(request, reconnect);

            if (reconnect)
            {
                this.OnGameServerReconnected();
            }
        }
Ejemplo n.º 3
0
        private void SetStateAndLoadPrediction(IRegisterGameServer request, bool reconnect)
        {
            this.UpdateLoadLevel(null, request.LoadLevelCount, request.LoadIndex);

            if (!this.SetServerState((ServerState)request.ServerState))
            {
                this.application.LoadBalancer.TryUpdateServer(this, this.LoadLevel, this.LoadBalancerPriority, this.State);
            }

            if (CommonSettings.Default.UseLoadPrediction && request.PredictionData != null)
            {
                this.prediction = new LoadPrediction(request.LoadLevelCount, request.PredictionData);
            }
        }
Ejemplo n.º 4
0
        public GameServerContext(GameServerContextManager gameServerContextManager, MasterApplication application, IRegisterGameServer request)
        {
            this.contextManager = gameServerContextManager;
            this.application    = application;

            this.AddressInfo = GameServerAddressInfo.CreateAddressInfo(request, log);

            this.Key                  = GetKey(request);
            this.ServerId             = request.ServerId;
            this.LoadBalancerPriority = request.LoadBalancerPriority;
            this.State                = ServerState.Offline;

            if (request.SupportedProtocols != null && request.SupportedProtocols.Length != 0)
            {
                this.SupportedProtocols = new List <byte>(request.SupportedProtocols);
            }
        }
Ejemplo n.º 5
0
 public static string GetKey(IRegisterGameServer request)
 {
     return(string.Format("{0}-{1}-{2}", request.GameServerAddress, request.UdpPort, request.TcpPort));
 }
Ejemplo n.º 6
0
 public void RegisterGameServerOnInit(IRegisterGameServer request, IGameServerPeer peer)
 {
     this.RegisterGameServer(request, peer, registerByRequet: false);
 }
Ejemplo n.º 7
0
 public void RegisterGameServer(IRegisterGameServer request, IGameServerPeer peer)
 {
     this.RegisterGameServer(request, peer, registerByRequet: true);
 }
Ejemplo n.º 8
0
 protected virtual GameServerContext CreateContext(IRegisterGameServer request)
 {
     return(new GameServerContext(this, this.application, request));
 }
Ejemplo n.º 9
0
        public static GameServerAddressInfo CreateAddressInfo(IRegisterGameServer registerRequest, ILogger log)
        {
            var result = new GameServerAddressInfo
            {
                Address = registerRequest.GameServerAddress
            };

            if (registerRequest.GameServerAddressIPv6 != null &&
                IPAddress.Parse(registerRequest.GameServerAddressIPv6).AddressFamily == AddressFamily.InterNetworkV6)
            {
                result.AddressIPv6 = string.Format("[{0}]", IPAddress.Parse(registerRequest.GameServerAddressIPv6));
            }
            result.Hostname = registerRequest.GameServerHostName;

            if (registerRequest.UdpPort.HasValue)
            {
                result.UdpAddress     = string.IsNullOrEmpty(result.Address) ? null : string.Format("{0}:{1}", result.Address, registerRequest.UdpPort);
                result.UdpAddressIPv6 = string.IsNullOrEmpty(result.AddressIPv6) ? null : string.Format("{0}:{1}", result.AddressIPv6, registerRequest.UdpPort);
                result.UdpHostname    = string.IsNullOrEmpty(result.Hostname) ? null : string.Format("{0}:{1}", result.Hostname, registerRequest.UdpPort);
            }

            if (registerRequest.TcpPort.HasValue)
            {
                result.TcpAddress     = string.IsNullOrEmpty(result.Address) ? null : string.Format("{0}:{1}", result.Address, registerRequest.TcpPort);
                result.TcpAddressIPv6 = string.IsNullOrEmpty(result.AddressIPv6) ? null : string.Format("{0}:{1}", result.AddressIPv6, registerRequest.TcpPort);
                result.TcpHostname    = string.IsNullOrEmpty(result.Hostname) ? null : string.Format("{0}:{1}", result.Hostname, registerRequest.TcpPort);
            }

            if (registerRequest.WebSocketPort.HasValue && registerRequest.WebSocketPort != 0)
            {
                result.WebSocketAddress = string.IsNullOrEmpty(result.Address)
                    ? null
                    : string.Format("ws://{0}:{1}", result.Address, registerRequest.WebSocketPort);

                result.WebSocketAddressIPv6 = string.IsNullOrEmpty(result.AddressIPv6)
                    ? null
                    : string.Format("ws://{0}:{1}", result.AddressIPv6, registerRequest.WebSocketPort);

                result.WebSocketHostname = string.IsNullOrEmpty(result.Hostname)
                    ? null
                    : string.Format("ws://{0}:{1}", result.Hostname, registerRequest.WebSocketPort);
            }

            if (registerRequest.HttpPort.HasValue && registerRequest.HttpPort != 0)
            {
                result.HttpAddress = string.IsNullOrEmpty(result.Address)
                    ? null
                    : string.Format("http://{0}:{1}{2}", result.Address, registerRequest.HttpPort, registerRequest.HttpPath);

                result.HttpAddressIPv6 = string.IsNullOrEmpty(result.AddressIPv6)
                    ? null
                    : string.Format("http://{0}:{1}{2}", result.AddressIPv6, registerRequest.HttpPort, registerRequest.HttpPath);

                result.HttpHostname = string.IsNullOrEmpty(result.Hostname)
                    ? null
                    : string.Format("http://{0}:{1}{2}", result.Hostname, registerRequest.HttpPort, registerRequest.HttpPath);
            }

            if (registerRequest.WebRTCPort.HasValue && registerRequest.WebRTCPort != 0)
            {
                result.WebRTCAddress = string.IsNullOrEmpty(result.Address)
                    ? null
                    : string.Format("{0}:{1}", result.Address, registerRequest.WebRTCPort);
            }

            // HTTP & WebSockets require a proper domain name (especially for certificate validation on secure Websocket & HTTPS connections):
            if (string.IsNullOrEmpty(result.Hostname))
            {
                log.WarnFormat("HTTPs & Secure WebSockets not supported. GameServer {0} does not have a public hostname.", result.Address);
            }
            else
            {
                if (registerRequest.SecureWebSocketPort.HasValue && registerRequest.SecureWebSocketPort != 0)
                {
                    result.SecureWebSocketHostname = string.Format("wss://{0}:{1}", result.Hostname, registerRequest.SecureWebSocketPort);
                }

                if (registerRequest.SecureHttpPort.HasValue && registerRequest.SecureHttpPort != 0)
                {
                    result.SecureHttpHostname = string.Format("https://{0}:{1}{2}", result.Hostname, registerRequest.SecureHttpPort, registerRequest.HttpPath);
                }
            }
            return(result);
        }