예제 #1
0
        private void Receiver_ClientDataReceived(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                ReceiveData data = e.UserState as ReceiveData;
                if (data != null)
                {
                    MessageData messageData = data.clientData;

                    if (messageData != null && messageData.id > 0)
                    {
                        Console.WriteLine("received Message Type: {0}", messageData.id);
                        if (MyClient != null)
                        {
                            Console.WriteLine("\tFrom Client: {0}", data.clientHandle);

                            // It's a string message, so just print it out for now.
                            Console.WriteLine("[{0}]: {1} ", messageData.name, ((messageData.message is string) ? messageData.message : ((messageData.message as byte[]).Length + " bytes")));
                        }

                        if (MessageFactory != null)
                        {
                            IMessageImpl msgImpl = MessageFactory.MakeMessageImpl(messageData.id, MyClient.ClientHandle);

                            if (msgImpl != default(IMessageImpl))
                            {
                                msgHandler.Handle(MyClient, messageData, msgImpl, this);
                            }
                        }
                    }
                }
            }
        }
        private void HandleGetUserName(Client client, MessageData messageData)
        {
            Console.WriteLine("Handle User Name Register.");

            try
            {
                // Register the name
                _server.ClientHandleToUserName.Add(client.ClientHandle, (string)messageData.name);

                MessageData msg = new MessageData();
                msg.handle   = messageData.handle;
                msg.id       = 1;
                msg.name     = messageData.name;
                msg.response = false;
                msg.message  = String.Format("[{0}] has joined and says \'{1}\'.", messageData.name, messageData.message);
                IMessageImpl impl = MessageImplFactory.Instance().MakeMessageImpl((int)MessageImplFactory.MessageFactoryTypesEnum.GLOBAL_MSG_TYPE, client.ClientHandle);
                if (impl != default(IMessageImpl))
                {
                    _server.MessageHandler.Handle(client, msg, impl, _server);
                    //HandleGlobalMessageSendAsync(client, msg);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Client already registered a Name?: " + e.Message);
            }
        }
예제 #3
0
        public bool Handle(Client client, MessageData message, IMessageImpl action, object handlerArgs)
        {
            if (client == null || message == null)
            {
                return(false);
            }
            bool retVal = false;

            //lock (lockObj)
            //{
            //IMessageHandler handler = GetMessageHandler();
            //if (handler != default(IMessageHandler))
            //{
            SetHandlerData(handlerArgs, action);
            retVal = HandleMessage(client, message, action);
            //}
            //}
            return(retVal);
        }
예제 #4
0
        public IMessageImpl GetMessageImpl(int msgId)
        {
            MessageTypeEnum msgType = MessageTypeEnum.MSG_TYPE_UNINIT;
            IMessageImpl    impl    = default(IMessageImpl);

            if (Enum.TryParse(msgId.ToString(), out msgType))
            {
                switch (msgType)
                {
                case MessageTypeEnum.MSG_TYPE_DEFAULT:
                    impl = new DefaultMessageImpl();
                    break;

                case MessageTypeEnum.MSG_TYPE_UNINIT:
                default:
                    Console.WriteLine("Unhandled message type: " + msgType);
                    break;
                }
            }
            return(impl);
        }
예제 #5
0
        private bool HandleClientExit(Client client, MessageData messageData)
        {
            bool handleExit = false;

            try
            {
                MessageData msg = new MessageData();
                msg.handle   = messageData.handle;
                msg.id       = 1;
                msg.name     = messageData.name;
                msg.response = false;
                msg.message  = String.Format("[{0}] has left.", messageData.name);
                IMessageImpl impl = MessageImplFactory.Instance().MakeMessageImpl((int)MessageImplFactory.MessageFactoryTypesEnum.GLOBAL_MSG_TYPE, client.ClientHandle);
                if (impl != default(IMessageImpl))
                {
                    handleExit = _server.MessageHandler.Handle(client, msg, impl, _server);
                }
                if (handleExit)
                {
                    // Remove client handle record keeping
                    var remHandle = _server.ClientHandleToUserName.Remove(client.ClientHandle);
                    // Remove the client impls
                    var remImpl = MessageImplFactory.Instance().RemoveClient(client.ClientHandle);
                    // Remove the client object
                    var remClient = ClientStore.RemoveClient(client.ClientHandle);

                    return(remHandle && remImpl && remClient);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Client Handle Remove Exception: " + ex.Message);
                handleExit = false;
            }
            return(handleExit);
        }
예제 #6
0
 public override void SetHandlerData(object data, IMessageImpl action)
 {
     action.SetActionData(data);
 }
예제 #7
0
 public override bool HandleMessage(Client client, MessageData messageData, IMessageImpl action)
 {
     return(action.PerformAction(client, messageData));
 }
예제 #8
0
 abstract public void SetHandlerData(object data, IMessageImpl action);
예제 #9
0
 abstract public bool HandleMessage(Client client, MessageData messageData, IMessageImpl action);
예제 #10
0
        /// <summary>
        /// Interface implementation to create the Impls that provide the actions to
        /// received messages.
        /// </summary>
        /// <param name="msgType">The incoming message type</param>
        /// <param name="clientHandle">The client that sent the message</param>
        /// <returns>IMessageImpl</returns>
        public IMessageImpl MakeMessageImpl(int msgType, long clientHandle)
        {
            IMessageImpl impl = default;

            bool success = Enum.TryParse(msgType.ToString(), out MessageFactoryTypesEnum msgFactoryType);

            Console.WriteLine("Getting IMPL for Client: {0}; TASK: {1}", clientHandle, msgType.ToString());

            if (!success)
            {
                return(impl);
            }

            // The stored client impls we're looking to reuse.  New clients are created and
            // stored further below.
            Dictionary <MessageFactoryTypesEnum, IMessageImpl> client;

            // The success block.  If we have a client already and it has the impl,
            // just return the impl for re-use.
            bool clientFound = implStore.TryGetValue(clientHandle, out client);

            if (clientFound)
            {
                if (client.TryGetValue(msgFactoryType, out impl))
                {
                    Console.WriteLine("Found Client: {0}", clientHandle);

                    return(impl);
                }
            }

            // The not found block.  We have to create a new impl regardless.  We may have
            // found a client already.  Add the impl if we have.  If not, create a new one
            // and add it to the impl Store.
            try
            {
                impl = GetMessageImpl(msgType);

                if (impl == default(IMessageImpl))
                {
                    return(impl);
                }

                lock (lockObj)
                {
                    if (!clientFound)
                    {
                        client = new Dictionary <MessageFactoryTypesEnum, IMessageImpl>
                        {
                            { msgFactoryType, impl }
                        };
                        implStore.Add(clientHandle, client);

                        Console.WriteLine("Added Client: {0}", clientHandle);

                        return(impl);
                    }

                    // We have a client  Add the impl.
                    client.Add(msgFactoryType, impl);
                    Console.WriteLine("Added Task: {0} to Client: {1}", msgType.ToString(), clientHandle);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("ImplFactory Exception: " + e.Message);
                impl = default;
            }
            return(impl);
        }