예제 #1
0
        private void DispatchMessage(Message message)
        {
            if (message.IsMessage(MessageType.UDPQUERYBAG))
            {
                UDPRevResultMessage revmsg = EntityBufCore.DeSerialize <UDPRevResultMessage>(message.MessageBuffer);

                var  respmsg = new Message(MessageType.UDPANSWERBAG);
                bool isreved = false;
                revmsg.Miss    = GetMissSegment(revmsg.BagId, null, out isreved);
                revmsg.IsReved = isreved;
                respmsg.SetMessageBody(revmsg);

                SendMessage(respmsg, null);
            }
            else if (message.IsMessage(MessageType.UDPANSWERBAG))
            {
                UDPRevResultMessage  revmsg = EntityBufCore.DeSerialize <UDPRevResultMessage>(message.MessageBuffer);
                AutoReSetEventResult wait   = null;
                if (_resetevent.TryGetValue(revmsg.BagId, out wait))
                {
                    wait.WaitResult = revmsg;
                    wait.IsTimeOut  = false;
                    wait.Set();
                }
            }
            else
            {
                OnMessage(message);
            }
        }
        protected override void FormAppMessage(Message message, Session session)
        {
            //base.ReciveMessage(message);
            byte[] result = DoMessage(message);

            if (result != null && !string.IsNullOrEmpty(message.MessageHeader.TransactionID))
            {
                if (watingEvents.Count == 0)
                {
                    return;
                }

                AutoReSetEventResult autoEvent = watingEvents.First(p => p.Key == message.MessageHeader.TransactionID).Value;
                if (autoEvent != null)
                {
                    autoEvent.WaitResult = result;
                    autoEvent.IsTimeOut  = false;
                    autoEvent.Set();

                    if (OnAppMessage != null)
                    {
                        OnAppMessage(session, message);
                    }

                    return;
                }
            }

            base.FormAppMessage(message, session);
        }
예제 #3
0
        private void DispatchMessage(Message message, IPEndPoint endpoint)
        {
            if (message.IsMessage(MessageType.UDPQUERYBAG))
            {
                UDPRevResultMessage revmsg = LJC.FrameWork.EntityBuf.EntityBufCore.DeSerialize <UDPRevResultMessage>(message.MessageBuffer);

                var  respmsg = new Message(MessageType.UDPANSWERBAG);
                bool isreved = false;
                revmsg.Miss    = GetMissSegment(revmsg.BagId, endpoint, out isreved);
                revmsg.IsReved = isreved;
                respmsg.SetMessageBody(revmsg);

                SendMessage(respmsg, endpoint);
            }
            else if (message.IsMessage(MessageType.UDPANSWERBAG))
            {
                UDPRevResultMessage  revmsg = LJC.FrameWork.EntityBuf.EntityBufCore.DeSerialize <UDPRevResultMessage>(message.MessageBuffer);
                AutoReSetEventResult wait   = null;
                string key = string.Format("{0}:{1}:{2}", endpoint.Address.ToString(), endpoint.Port, revmsg.BagId);
                if (_resetevent.TryGetValue(key, out wait))
                {
                    wait.WaitResult = revmsg;
                    wait.IsTimeOut  = false;
                    wait.Set();
                }
            }
            else if (message.IsMessage(MessageType.UPDSETMTU))
            {
                var mtu = LJC.FrameWork.EntityBuf.EntityBufCore.DeSerialize <UDPSetMTUMessage>(message.MessageBuffer).MTU;
                if (mtu < MTU_MIN)
                {
                    mtu = MTU_MIN;
                }
                if (mtu > MTU_MAX)
                {
                    mtu = MTU_MAX;
                }

                lock (_MTUDic)
                {
                    var key = endpoint.Address.ToString();
                    if (_MTUDic.ContainsKey(key))
                    {
                        _MTUDic[key] = mtu;
                    }
                    else
                    {
                        _MTUDic.Add(key, mtu);
                    }
                }
            }
            else if (message.IsMessage(MessageType.UDPCLEARBAGID))
            {
                ClearTempData(endpoint);
            }
            else
            {
                FromApp(message, endpoint);
            }
        }
예제 #4
0
        /// <summary>
        /// 需要实现DoMessage
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="message"></param>
        /// <param name="timeOut"></param>
        /// <returns></returns>
        public T SendMessageAnsy <T>(Message message, int timeOut = 30000)
        {
            if (string.IsNullOrEmpty(message.MessageHeader.TransactionID))
            {
                throw new Exception("消息没有设置唯一的序号。无法进行同步。");
            }

            string reqID = message.MessageHeader.TransactionID;

            using (AutoReSetEventResult autoResetEvent = new AutoReSetEventResult(reqID))
            {
                watingEvents.TryAdd(reqID, autoResetEvent);
                BuzException = null;
                SendMessage(message);
                //new Func<Message, bool>(SendMessage).BeginInvoke(message, null, null);
                WaitHandle.WaitAny(new WaitHandle[] { autoResetEvent }, timeOut);
                AutoReSetEventResult removedicitem = null;
                watingEvents.TryRemove(reqID, out removedicitem);

                if (BuzException != null)
                {
                    throw BuzException;
                }

                if (autoResetEvent.IsTimeOut)
                {
                    var ex = new TimeoutException();
                    ex.Data.Add("errorsender", "LJC.FrameWork.SocketApplication.SocketSTD.SessionClient");
                    ex.Data.Add("MessageType", message.MessageHeader.MessageType);
                    ex.Data.Add("TransactionID", message.MessageHeader.TransactionID);
                    ex.Data.Add("ipString", this.ipString);
                    ex.Data.Add("ipPort", this.ipPort);
                    if (message.MessageBuffer != null)
                    {
                        ex.Data.Add("MessageBuffer", Convert.ToBase64String(message.MessageBuffer));
                    }
                    ex.Data.Add("resulttype", typeof(T).FullName);
                    //LogManager.LogHelper.Instance.Error("SendMessageAnsy", ex);
                    throw ex;
                }
                else
                {
                    if (autoResetEvent.DataException != null)
                    {
                        throw autoResetEvent.DataException;
                    }
                    try
                    {
                        T result = EntityBufCore.DeSerialize <T>((byte[])autoResetEvent.WaitResult);
                        return(result);
                    }
                    catch (Exception ex)
                    {
                        Exception e = new Exception("解析消息体失败:" + reqID, ex);
                        e.Data.Add("messageid", reqID);
                        throw e;
                    }
                }
            }
        }
예제 #5
0
        /// 需要实现DoMessage
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="message"></param>
        /// <param name="timeOut"></param>
        /// <returns></returns>
        public T SendMessageAnsy <T>(Message message, int timeOut = 30000)
        {
            if (string.IsNullOrEmpty(message.MessageHeader.TransactionID))
            {
                throw new Exception("消息没有设置唯一的序号。无法进行同步。");
            }

            string reqID = message.MessageHeader.TransactionID;

            using (AutoReSetEventResult autoResetEvent = new AutoReSetEventResult(reqID))
            {
                watingEvents.Add(reqID, autoResetEvent);
                BuzException = null;

                SendMessage(message, null);
                //ThreadPool.QueueUserWorkItem(new WaitCallback(o => { SendMessage((Message)o); }), message);
                //new Func<Message, bool>(SendMessage).BeginInvoke(message, null, null);

                autoResetEvent.WaitOne(timeOut);
                //WaitHandle.WaitAny(new WaitHandle[] { autoResetEvent }, timeOut);

                watingEvents.Remove(reqID);

                if (BuzException != null)
                {
                    BuzException.Data.Add("MessageType", message.MessageHeader.MessageType);
                    BuzException.Data.Add("TransactionID", message.MessageHeader.TransactionID);
                    throw BuzException;
                }

                if (autoResetEvent.IsTimeOut)
                {
                    var ex = new TimeoutException();
                    ex.Data.Add("errorsender", "LJC.FrameWork.SocketApplication.SocketEasyUDP.Client.SessionClient");
                    ex.Data.Add("MessageType", message.MessageHeader.MessageType);
                    ex.Data.Add("TransactionID", message.MessageHeader.TransactionID);
                    if (SessionContext != null)
                    {
                        ex.Data.Add("SessionContext.IPAddress", this.SessionContext.IPAddress);
                        ex.Data.Add("SessionContext.Port", this.SessionContext.Port);
                    }
                    if (message.MessageBuffer != null)
                    {
                        ex.Data.Add("MessageBuffer", Convert.ToBase64String(message.MessageBuffer));
                    }
                    ex.Data.Add("resulttype", typeof(T).FullName);
                    LogManager.LogHelper.Instance.Error("SendMessageAnsy", ex);
                    throw ex;
                }
                else
                {
                    T result = EntityBufCore.DeSerialize <T>((byte[])autoResetEvent.WaitResult);
                    return(result);
                }
            }
        }
예제 #6
0
        private UDPRevResultMessage QuestionBag(long bagid, IPEndPoint endpoint)
        {
            int     trytimes = 0;
            Message question = new Message(MessageType.UDPQUERYBAG);

            question.SetMessageBody(new UDPRevResultMessage
            {
                BagId = bagid
            });

            string key  = string.Format("{0}:{1}:{2}", endpoint.Address.ToString(), endpoint.Port, bagid);
            var    wait = new AutoReSetEventResult(string.Empty);

            _resetevent.Add(key, wait);

            try
            {
                while (true)
                {
                    wait.IsTimeOut = true;
                    wait.Reset();
                    try
                    {
                        SendMessageNoSure(question, endpoint);
                        wait.WaitOne(100);
                        if (!wait.IsTimeOut)
                        {
                            return((UDPRevResultMessage)wait.WaitResult);
                        }
                        else
                        {
                            throw new TimeoutException();
                        }
                    }
                    catch (TimeoutException ex)
                    {
                        trytimes++;
                        if (trytimes >= 10)
                        {
                            throw ex;
                        }
                    }
                }
            }
            finally
            {
                _resetevent.Remove(key);
            }
        }
        public T SendMessageAnsy <T>(Session s, Message message, int timeOut = 60000)
        {
            if (string.IsNullOrEmpty(message.MessageHeader.TransactionID))
            {
                throw new Exception("消息没有设置唯一的序号。无法进行同步。");
            }

            string reqID = message.MessageHeader.TransactionID;

            using (AutoReSetEventResult autoResetEvent = new AutoReSetEventResult(reqID))
            {
                watingEvents.Add(reqID, autoResetEvent);

                if (s.SendMessage(message))
                {
                    WaitHandle.WaitAny(new WaitHandle[] { autoResetEvent }, timeOut);

                    watingEvents.Remove(reqID);

                    if (autoResetEvent.IsTimeOut)
                    {
                        var ex = new TimeoutException();
                        ex.Data.Add("errorsender", "LJC.FrameWork.SocketApplication.SocketSTD.SessionServer");
                        ex.Data.Add("MessageType", message.MessageHeader.MessageType);
                        ex.Data.Add("TransactionID", message.MessageHeader.TransactionID);
                        ex.Data.Add("ipString", this.ipString);
                        ex.Data.Add("ipPort", this.ipPort);
                        if (message.MessageBuffer != null)
                        {
                            ex.Data.Add("MessageBuffer", Convert.ToBase64String(message.MessageBuffer));
                        }
                        ex.Data.Add("resulttype", typeof(T).FullName);
                        //LogManager.LogHelper.Instance.Error("SendMessageAnsy", ex);
                        throw ex;
                    }
                    else
                    {
                        T result = EntityBufCore.DeSerialize <T>((byte[])autoResetEvent.WaitResult);
                        return(result);
                    }
                }
                else
                {
                    throw new Exception("发送失败。");
                }
            }
        }
예제 #8
0
        protected void ReciveMessage(Message message)
        {
            if (!string.IsNullOrEmpty(message.MessageHeader.TransactionID))
            {
                AutoReSetEventResult autoEvent = null;

                Console.WriteLine("收到消息:" + message.MessageHeader.TransactionID);

                if (watingEvents.TryGetValue(message.MessageHeader.TransactionID, out autoEvent))
                {
                    autoEvent.WaitResult = message.MessageBuffer;
                    autoEvent.IsTimeOut  = false;
                    autoEvent.Set();
                    return;
                }
            }
        }
예제 #9
0
        protected override void ReciveMessage(Message message)
        {
            //base.ReciveMessage(message);

            if (!string.IsNullOrEmpty(message.MessageHeader.TransactionID))
            {
                if (watingEvents.Count == 0)
                {
                    return;
                }


                byte[]    result  = null;
                Exception innerex = null;

                try
                {
                    result = DoMessage(message);
                }
                catch (Exception ex)
                {
                    innerex = ex;
                }

                AutoReSetEventResult autoEvent = null;
                if (watingEvents.TryGetValue(message.MessageHeader.TransactionID, out autoEvent))
                {
                    autoEvent.WaitResult    = result;
                    autoEvent.IsTimeOut     = false;
                    autoEvent.DataException = innerex;
                    autoEvent.Set();
                    return;
                }
            }

            base.ReciveMessage(message);
        }