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); }
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); } }
/// <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; } } } }
/// 需要实现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); } } }
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("发送失败。"); } } }
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; } } }
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); }