using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; namespace Passer.RoboidControl { /// /// A site server is a participant which provides a shared simulated environment /// public class SiteServer : Participant { /// /// Create a new site server /// /// public SiteServer(int port = 7681) { this.name = "Site Server"; this.ipAddress = "0.0.0.0"; this.port = port; //this.endPoint = new IPEndPoint(IPAddress.Parse(ipAddress), port); // for sending Console.Write($"Prepare receive on port {port}"); this.udpClient = new UdpClient(port); // for receiving this.udpClient.BeginReceive( new AsyncCallback(result => ReceiveUDP(result)), new Tuple(this.udpClient, new IPEndPoint(IPAddress.Any, port))); } /// /// Close the site /// public void Close() { this.udpClient?.Close(); } public override void Publish() { } protected override void Process(RemoteParticipant sender, ParticipantMsg msg) { if (msg.networkId == 0) { Console.WriteLine($"{this.name} received New Client -> {sender.networkId}"); this.Send(sender, new NetworkIdMsg(sender.networkId)); } } protected override void Process(RemoteParticipant sender, NetworkIdMsg msg) { } protected override void Process(RemoteParticipant sender, ThingMsg msg) { //Console.WriteLine($"SiteServer: Process thing [{msg.networkId}/{msg.thingId}]"); Thing thing = sender.Get(msg.networkId, msg.thingId); if (thing == null) { Thing newThing = null; if (thingMsgProcessors.TryGetValue(msg.thingType, out Func value)) { if (value != null) newThing = value(msg.networkId, msg.thingId); } if (newThing == null) newThing = new Thing(sender, msg.networkId, msg.thingId, msg.thingType); sender.Add(newThing); } } } }