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); } }
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; }
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); }
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; }
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); }
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()); }
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); } }
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); } }
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(); }
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); } }
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(); }
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); } }
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); } }
protected abstract void HandleClient(CvarcClient client);
void ClientConnected(CvarcClient client) { var th = new Thread(() => { client.WriteLine(new byte[] { 1, 2, 3 }); client.ReadLine(); }); th.IsBackground = true; th.Start(); }
protected override void HandleClient(CvarcClient client) { Dispatcher.AddRunner(new NetworkRunner(client)); }
static void ClientConnected(CvarcClient client) { //в отдельном трэде делать! RunThread( new Action(() => { WaitingNetworkServer.ClientOnServerSide = client; loader.ReceiveConfiguration(WaitingNetworkServer); loadedNetworkServerData = WaitingNetworkServer; // сигнал того, что мир готов к созданию. RenewWaitingNetworkServer(); // а это мы делаем, чтобы следующее подключение удалось. // создавать его прямо здесь нельзя, потому что другой трэд }), "Connection");//.BeginInvoke(null, null); }
protected override void HandleClient(CvarcClient client) { TournamentPool.AddPlayerToPool(client); }