Пример #1
0
        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;
                    }
                }
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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();
        }
Пример #4
0
 public void OnDestroy()
 {
     NetworkComponent?.Disconnect();
 }