private void ProcessMessage(ReceivedMessage receivedMessage) { try { var senderHostId = HostMapping.GetHostIdForSocket(receivedMessage.SenderSocket); int receipentHostId; BaseMessage deserializedMessage; logger.Debug("[CS] Received message from host with id = {senderHostId}", senderHostId); if (!HostMapping.IsHostGameMaster(senderHostId)) { // TODO: Decide what should be done if GameMaster has not connected yet (NoGameMaster) receipentHostId = HostMapping.GetGameMasterHostId(); deserializedMessage = MessageSerializer.DeserializeMessage(receivedMessage.SerializedMessage); deserializedMessage.SetAgentId(senderHostId); } else { deserializedMessage = MessageSerializer.DeserializeMessage(receivedMessage.SerializedMessage, true); receipentHostId = deserializedMessage.AgentId; } logger.Debug("[CS] Message type = {id} (id = {indId})", deserializedMessage.MessageId, (int)deserializedMessage.MessageId); logger.Debug("[CS] Forwarding to host with id = {recipent}", receipentHostId); var receipentSocket = HostMapping.GetSocketForHostId(receipentHostId); NetworkComponent.SendMessage(receipentSocket, deserializedMessage); } catch (JsonSerializationException e) { logger.Error("[CS] {message}", e.Message); } catch (CommunicationErrorException e) { logger.Error("[CS] {message}", e.Message); // Socket has been closed or is invalid if (e.Type == CommunicationExceptionType.InvalidSocket) { if (receivedMessage.SenderSocket == null) { return; } var senderHostId = HostMapping.GetHostIdForSocket(receivedMessage.SenderSocket); // Message should be sent to GameMaster but error occured - abort if (!HostMapping.IsHostGameMaster(senderHostId)) { throw; } } } }
public CommunicationServer(CommunicationServerConfiguration configuration) { logger.Info("[CS] CommunicationServer created"); Configuration = configuration; NetworkComponent = new NetworkComponent(this); HostMapping = new HostMapping(); messageQueue = new ConcurrentQueue <ReceivedMessage>(); shouldProcessMessage = new ManualResetEvent(false); }
public void Run() { try { IPAddress = NetworkComponent.GetLocalIPAddress(); gameMasterListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); gameMasterListener.NoDelay = true; agentListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); agentListener.NoDelay = true; } catch (SocketException ex) { throw new CommunicationErrorException(CommunicationExceptionType.SocketNotCreated, ex); } NetworkComponent.StartListening(gameMasterListener, agentListener); ProcessMessages(); }
public void OnDestroy() { NetworkComponent?.Disconnect(); }