public static void RecieveGameserverReady(GameserverInstance gameserverReady, Client _client)
        {
            Console.WriteLine($"Gameserver {gameserverReady.GameserverID} ready recieved");
            GameserverInstance instance = null;

            // Find a server that is now ready
            lock (ConfiguringGameserverInstances)
            {
                foreach (GameserverInstance server in ConfiguringGameserverInstances.Keys)
                {
                    if (server.GameserverID == gameserverReady.GameserverID)
                    {
                        instance           = server;
                        instance.GameState = gameserverReady.GameState;
                        instance.Client    = _client;
                        lock (LiveGameInstances)
                        {
                            LiveGameInstances.Add(instance);
                            Console.WriteLine("Added!");
                        }
                        break;
                    }
                }
            }

            if (instance != null)
            {
                SendServerToClient(instance);
            }
        }
        public static void ReceiveRegisterRequest(GameserverInstance gameserverToRegister, Client client)
        {
            Console.WriteLine($"Started server on {gameserverToRegister.IP + ":" + gameserverToRegister.Port}");

            Console.WriteLine($"Gameserver remote endpoint: {((client.TcpClient.Client.RemoteEndPoint) as IPEndPoint).Address.ToString() + ":" + ((client.TcpClient.Client.RemoteEndPoint) as IPEndPoint).Port.ToString()}");
            Console.WriteLine($"Gameserver local endpoint: {((client.TcpClient.Client.LocalEndPoint) as IPEndPoint).Address.ToString() + ":" + ((client.TcpClient.Client.LocalEndPoint) as IPEndPoint).Port.ToString()}");

            GameserverInstance instance = null;

            // Find a server that is now ready
            lock (ConfiguringGameserverInstances)
            {
                foreach (GameserverInstance server in ConfiguringGameserverInstances.Keys)
                {
                    if (server.GameState == GameState.Starting)
                    {
                        instance = server;
                        break;
                    }
                }
            }

            // We found a starting server
            // Merge with information of started server
            if (instance != null)
            {
                instance.GameserverID = gameserverToRegister.GameserverID;
                instance.Port         = gameserverToRegister.Port;
                instance.IP           = gameserverToRegister.IP;
                instance.GameState    = GameState.Configuring;
                SendServerConfiguration(instance, client);
            }
        }
        /// <summary>
        /// Creates a game server instance
        /// </summary>
        public static void CreateGameServer(GameserverInstance gameServerInstance, Client client)
        {
            Console.WriteLine("Creating server instance");
            gameServerInstance.GameState = GameState.Starting;

            lock (ConfiguringGameserverInstances)
            {
                ConfiguringGameserverInstances.Add(gameServerInstance, client);
            }

            StartGameserverOnCluster();
        }
        private static void SendServerConfiguration(GameserverInstance instanceToConfigure, Client client)
        {
            Console.WriteLine($"Sending server configuration to {instanceToConfigure.GameserverID}");

            string JSON = JsonConvert.SerializeObject(instanceToConfigure);


            Packet packet = new Packet((int)MessageType.Configure);

            packet.Write(JSON);
            packet.WriteLength();

            client.TcpClient.GetStream().BeginWrite(packet.ToArray(), 0, packet.Length(), null, null);
        }
        private static void SendServerToClient(GameserverInstance instance)
        {
            string JSON = JsonConvert.SerializeObject(instance);


            Packet packet = new Packet((int)MessageType.Ready);

            packet.Write(JSON);
            packet.WriteLength();

            lock (ConfiguringGameserverInstances)
            {
                Console.WriteLine($"Sending gameserver {instance.GameserverID} information to player");
                ConfiguringGameserverInstances[instance].TcpClient.GetStream().BeginWrite(packet.ToArray(), 0, packet.Length(), null, null);
                //instance.Client = ConfiguringGameserverInstances[instance];
                ConfiguringGameserverInstances.Remove(instance);
            }
        }
Exemple #6
0
        private bool HandleIncomingData(byte[] data)
        {
            //Read the length of the next data packet
            int packetLength = 0;

            incomingPacket.SetBytes(data);
            //Check if there is 4 or more bytes in the packet (size of int is 4)
            if (incomingPacket.UnreadLength() >= 4)
            {
                //Read the length of the incoming packet
                packetLength = incomingPacket.ReadInt();
                if (packetLength <= 0)
                {
                    //If the length is 0, return
                    return(true);
                }
            }

            //Keep reading until there is no more data left to read for this specific packet
            //We keep this in a while loop here because one packet might be made up of several packets
            while (packetLength > 0 && packetLength <= incomingPacket.UnreadLength())
            {
                //Handle packet
                //Read the messagetype
                int         messageTypeInt = incomingPacket.ReadInt();
                MessageType messageType    = (MessageType)messageTypeInt;
                string      messageJSON    = "";

                switch (messageType)
                {
                case MessageType.Create:
                    messageJSON = incomingPacket.ReadString();
                    GameserverInstance gameserverToCreate = JsonConvert.DeserializeObject <GameserverInstance>(messageJSON);
                    ServerManager.CreateGameServer(gameserverToCreate, this);
                    break;

                case MessageType.Register:
                    messageJSON = incomingPacket.ReadString();
                    GameserverInstance gameserverToRegister = JsonConvert.DeserializeObject <GameserverInstance>(messageJSON);
                    ServerManager.ReceiveRegisterRequest(gameserverToRegister, this);
                    break;

                case MessageType.Ready:
                    messageJSON = incomingPacket.ReadString();
                    GameserverInstance gameserverReady = JsonConvert.DeserializeObject <GameserverInstance>(messageJSON);
                    ServerManager.RecieveGameserverReady(gameserverReady, this);
                    break;

                case MessageType.LiveServers:
                    ServerManager.SendAvailableServers(this);
                    break;

                default:
                    break;
                }

                packetLength = 0;

                //Check if there 4 or more bytes in the packet (size of int is 4)
                if (incomingPacket.UnreadLength() >= 4)
                {
                    //Read the length of the incoming packet
                    packetLength = incomingPacket.ReadInt();
                    if (packetLength <= 0)
                    {
                        //If the length is 0, return
                        return(true);
                    }
                }
            }

            if (packetLength <= 1)
            {
                return(true);
            }

            return(false);
        }