예제 #1
0
 public void StartThread()
 {
     Print("Server started");
     var listner=new TcpListener(IPAddress.Any, port);
     listner.Start();
     CvarcClient cvarcClient = null;
     while(true)
     {
         while (!listner.Pending())
         {
             if (exitRequest)
             {
                 if (cvarcClient != null)
                     cvarcClient.Close();
                 listner.Stop();
                 return;
             }
             Thread.Sleep(1);
         }
         var client = listner.AcceptTcpClient();
         Print("Client accepted");
         if (cvarcClient != null)
             cvarcClient.Close(); // этот метод должен внутри CvarcClient устанавливать флаг, при котором цикл внутри Read заканчивается исключением
         cvarcClient = new CvarcClient(client);
         if (ClientConnected != null)
             ClientConnected(cvarcClient);
     }
 }
예제 #2
0
        public NetworkRunner(CvarcClient client)
        {
            this.client = client;

            factory = new SoloNetworkControllerFactory(client);

            var configProposal = client.Read<ConfigurationProposal>();
            var loadingData = configProposal.LoadingData;
            var competitions = Dispatcher.Loader.GetCompetitions(loadingData);
            var settings = competitions.Logic.CreateDefaultSettings();
            if (configProposal.SettingsProposal != null)
                configProposal.SettingsProposal.Push(settings, true);
            configuration = new Configuration
            {
                LoadingData = loadingData,
                Settings = settings
            };

            //configuration.Settings.EnableLog = true;
            //configuration.Settings.LogFile = UnityConstants.LogFolderRoot + "cvarclog1";

            var worldSettingsType = competitions.Logic.WorldStateType;
            worldState = (IWorldState)client.Read(worldSettingsType);

            Name = loadingData.AssemblyName + loadingData.Level;
            CanInterrupt = true;
            CanStart = true;
        }
예제 #3
0
 public static void SingleClientScenario(Action<CvarcClient> scenario)
 {
     var client = new TcpClient();
     client.Connect("127.0.0.1", 14000);
     var cvarcClient = new CvarcClient(client);
     scenario(cvarcClient);
 }
예제 #4
0
 public static void RunServerScenario(Action<CvarcClient> scenario)
 {
     var listener = new TcpListener(14000);
     listener.Start();
     var client = listener.AcceptTcpClient();
     var cvarcClient = new CvarcClient(client);
     scenario(cvarcClient);
 }
		public override IController Create(string controllerId, IActor actor)
		{
			// if bot is assigned for controller, get it 
			var settings = GetSettings(controllerId);
			if (settings.Type == ControllerType.Bot)
				return CreateBot(controllerId);
			
			
			// running process
			var process = new Process();
			var directory = "Solutions\\" + settings.Name ;
			if (!Directory.Exists(directory))
				throw new Exception("Directory "+directory+" for robot "+controllerId+" is not found");
			var batFile = directory+"\\run.bat";
			if (!File.Exists(batFile))
				throw new Exception("run.bat is not found in directory "+directory+" for robot "+controllerId);
			process.StartInfo.FileName = "run.bat";
			process.StartInfo.WorkingDirectory = directory;
			process.StartInfo.Arguments = Port.ToString();
			process.Start();

			//waiting for incoming connection
			var watch = new Stopwatch();
			watch.Start();
			while(!listener.Pending())
			{
				if (watch.ElapsedMilliseconds>1000)
				{
					watch.Stop();
					if (!process.HasExited) process.Kill();
					throw new Exception("Process " + batFile + " for controller " + controllerId + " haven't established connection for "+timeToEstablishConnection+" millisecond");
				}
			}
			watch.Stop();

			processes.Add(process);
			var socketClient = listener.AcceptTcpClient();
			var client = new CvarcClient(socketClient);
			clients.Add(client);

			// skipping config so the client's protocol won't change from SoloNetwork mode
			client.Read<ConfigurationProposal>();
			client.Read(World.Competitions.Logic.WorldStateType);

			var controller = World.Competitions.Logic.Actors[controllerId].CreateNetworkController();
			controller.InitializeClient(client);
			return controller;
		}
예제 #6
0
        protected override void HandleClient(CvarcClient client)
        {
            var configProposal = client.Read<ConfigurationProposal>();
            var loadingData = configProposal.LoadingData; //RoboMoviesLevel1
            var competitions = Dispatcher.Loader.GetCompetitions(loadingData);
            var worldSettingsType = competitions.Logic.WorldStateType;
            var worldState = (IWorldState)client.Read(worldSettingsType);
            var settings = competitions.Logic.CreateDefaultSettings(); // таким образом игнорируются все настйроки пользователя сейчас.

            var configuration = new Configuration
            {
                LoadingData = loadingData,
                Settings = settings
            };
            TournamentPool.AddPlayerToPool(client, configuration, worldState, configProposal);
        }
예제 #7
0
 static void Control(bool runServer)
 {
     var client = new CvarcClient<object, SimpleMovementCommand>();
     client.Configurate(runServer, 14000, new ConfigurationProposal
     {
         LoadingData = new LoadingData { AssemblyName = "Demo", Level = "Collision" },
         SettingsProposal = new SettingsProposal
         {
             Controllers = new List<ControllerSettings>
               {
                   new ControllerSettings { ControllerId="Left", Type= ControllerType.Client, Name="This" },
                   new ControllerSettings { ControllerId="Right", Type= ControllerType.Bot, Name="Detail" }
               }
         }
     });
     client.Act(SimpleMovementCommand.Action("Grip"));
     client.Act(SimpleMovementCommand.Rotate(Angle.Pi, 1));
     client.Act(SimpleMovementCommand.Exit());
 }
예제 #8
0
        public static void AddPlayerToPool(CvarcClient client)
        {
            var configProposal = client.Read<ConfigurationProposal>();
            var loadingData = configProposal.LoadingData;
            var competitions = Dispatcher.Loader.GetCompetitions(loadingData);
            var worldSettingsType = competitions.Logic.WorldStateType;
            var worldState = (IWorldState)client.Read(worldSettingsType);

            lock (pool)
            {
                if (!pool.ContainsKey(loadingData))
                {
                    pool.Add(loadingData, new TournamentRunner(loadingData, worldState));
                    Dispatcher.AddRunner(pool[loadingData]);
                }
                if (pool[loadingData].AddPlayerAndCheck(new TournamentPlayer(client, configProposal, worldState)))
                    pool.Remove(loadingData);
            }
        }
예제 #9
0
        static void Main(string[] args)
        {
            int port = 14000;

            while (true)
            {
                try
                {
                    Console.Write("Attempting to connect ");
                    var client = new CvarcClient<object, MoveAndGripCommand>();

                    var loadingData = new LoadingData { AssemblyName = "Demo", Level = "Movement" };

                    var settings = new SettingsProposal
                    {
                        TimeLimit=3,
                        Controllers = new List<ControllerSettings> 
                        {
                            new ControllerSettings
                            {
                                 ControllerId=TwoPlayersId.Left, Name="This", Type= ControllerType.Client
                            }
                        }
                    };
                    
                    var state=KnownWorldStates.EmptyWithOneRobot(false);
                    var rules=new MoveAndGripRules();
                
                    client.Configurate(port, new ConfigurationProposal { LoadingData=loadingData, SettingsProposal=settings}, state);

                    client.Act(rules.Move(30));
                    client.Act(rules.Rotate(Angle.Pi));
                    client.Exit();
                    Console.WriteLine("Success");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
                Thread.Sleep(1000);
            }
        }
예제 #10
0
        protected override void HandleClient(CvarcClient client)
        {
            var configProposal = client.Read<ConfigurationProposal>();
            var loadingData = configProposal.LoadingData; //RoboMoviesLevel1
            var competitions = Dispatcher.Loader.GetCompetitions(loadingData);
            var worldSettingsType = competitions.Logic.WorldStateType;
            var worldState = (IWorldState)client.Read(worldSettingsType);
            var settings = competitions.Logic.CreateDefaultSettings();
            if (configProposal.SettingsProposal != null)
                configProposal.SettingsProposal.Push(settings, true);
            var configuration = new Configuration
            {
                LoadingData = loadingData,
                Settings = settings
            };

            TournamentPool.AddForceGame(worldState, configuration);

            client.Close();
        }
예제 #11
0
 public static void AddPlayerToPool(CvarcClient client, Configuration configuration, IWorldState worldState, ConfigurationProposal configProposal)
 {
     if (haveForceGame)
     {
         if (UnityConstants.OnlyGamesThroughServicePort)
             HttpWorker.SendInfoToLocal(configProposal.SettingsProposal.CvarcTag);
         if (forceRunner.AddPlayerAndCheck(new TournamentPlayer(client, configProposal, worldState)))
             haveForceGame = false;
         return;
     }
     lock (pool)
     {
         if (!pool.ContainsKey(configuration.LoadingData))
         {
             pool.Add(configuration.LoadingData, new TournamentRunner(worldState, configuration));
             Dispatcher.AddRunner(pool[configuration.LoadingData]);
         }
         if (pool[configuration.LoadingData].AddPlayerAndCheck(new TournamentPlayer(client, configProposal, worldState)))
             pool.Remove(configuration.LoadingData);
     }
 }
예제 #12
0
 static void Control(int port)
 {
     var client = new CvarcClient<DemoSensorsData, MoveAndGripCommand>();
     client.Configurate(port, new ConfigurationProposal
     {
         LoadingData = new LoadingData { AssemblyName = "Demo", Level = "Demo" },
         SettingsProposal = new SettingsProposal
         {
             TimeLimit=3,
             Controllers = new List<ControllerSettings>
               {
                   new ControllerSettings { ControllerId="Left", Type= ControllerType.Client, Name="This" },
                   new ControllerSettings { ControllerId="Right", Type= ControllerType.Bot, Name="Stand" }
               }
         }
     }, KnownWorldStates.EmptyWithOneRobot(false));
     var rules = new MoveAndGripRules();
     var sensors = client.Act(rules.Move(10));
     sensors = client.Act(rules.Rotate(Angle.Pi));
     client.Exit();
 }
예제 #13
0
 public void StartThread()
 {
     Print("Server started");
     var listner = new TcpListener(IPAddress.Any, port);
     listner.Start();
     while (true)
     {
         while (!listner.Pending())
         {
             if (exitRequest)
             {
                 listner.Stop();
                 Print("Server Exited");
                 return;
             }
             Thread.Sleep(1);
         }
         var client = listner.AcceptTcpClient();
         Print("Client accepted");
         var cvarcClient = new CvarcClient(client);
         HandleClient(cvarcClient);
     }
 }
예제 #14
0
 static void Control(bool runServer)
 {
     var client = new CvarcClient<SensorsWithCamera, SimpleMovementCommand>();
     client.Configurate(runServer, 14000, new ConfigurationProposal
     {
         LoadingData = new LoadingData { AssemblyName = "Demo", Level = "Camera" },
         SettingsProposal = new SettingsProposal
         {
             Controllers = new List<ControllerSettings>
               {
                   new ControllerSettings { ControllerId="Left", Type= ControllerType.Client, Name="This" },
                   new ControllerSettings { ControllerId="Right", Type= ControllerType.Bot, Name="Random" }
               }
         }
     });
     for (int i = 0; i < 100; i++)
     {
         var sensorsData = client.Act(SimpleMovementCommand.Rotate(Angle.Pi/20,0.1));
         var stream = new MemoryStream(sensorsData.Image);
         var bitmap = (Bitmap)Bitmap.FromStream(stream);
         form.UpdateBitmap(bitmap);
     }
 }
예제 #15
0
 protected abstract void HandleClient(CvarcClient client);
예제 #16
0
 void ClientConnected(CvarcClient client)
 {
     var th = new Thread(() =>
     {
         client.WriteLine(new byte[] { 1, 2, 3 });
         client.ReadLine();
     });
     th.IsBackground = true;
     th.Start();
 }
예제 #17
0
 protected override void HandleClient(CvarcClient client)
 {
     Dispatcher.AddRunner(new NetworkRunner(client));
 }
예제 #18
0
 static void ClientConnected(CvarcClient client)
 {
     //в отдельном трэде делать!
     RunThread(
     new Action(() =>
         {
             WaitingNetworkServer.ClientOnServerSide = client;
             loader.ReceiveConfiguration(WaitingNetworkServer);
             loadedNetworkServerData = WaitingNetworkServer; // сигнал того, что мир готов к созданию.
             RenewWaitingNetworkServer(); // а это мы делаем, чтобы следующее подключение удалось.
             // создавать его прямо здесь нельзя, потому что другой трэд
         }), "Connection");//.BeginInvoke(null, null);
 }
예제 #19
0
 protected override void HandleClient(CvarcClient client)
 {
     TournamentPool.AddPlayerToPool(client);
 }