Esempio n. 1
0
 private void __ActiveMiddlewareMessageWattinghere(MiddlewareTransferPackage mtPkg)
 {
     lock (_synWriteLockObject)
     {
         _asynWattingMiddlewareReplyMessages[mtPkg.MessageId] = mtPkg;
     }
 }
Esempio n. 2
0
 internal MiddlewareTransferPackage SynSendMessage(MiddlewareTransferPackage mtPkg, int timeoutMilliseconds)
 {
     if (mtPkg is RequestMTPackage)
     {
         return(__SendMessageAndWattingForResponse(mtPkg, timeoutMilliseconds));
     }
     else
     {
         throw new MiddlewareCommunicatErrorExcetion("不能尝试同步一份应答报文");
     }
 }
Esempio n. 3
0
        /// <summary>
        /// 非阻塞式执行一次消息发送请求
        /// </summary>
        /// <param name="mtPkg">发往远程中间件设备的消息包</param>
        internal void AsynSendMessage(MiddlewareTransferPackage mtPkg)
        {
            //will send a message
            if ((mtPkg is RequestMTPackage) && ((mtPkg as RequestMTPackage).WattingResponse))
            {
                __ActiveMiddlewareMessageWattinghere(mtPkg);
            }

            bool mustWaitReponse = true;
            ServerRequestPackage wilSendScsMsg = new ServerRequestPackage(mustWaitReponse);

            //配置为Middleware传输包
            IMiddleware2MiddlewareCommunicatRequest statSeter = wilSendScsMsg.Active_MiddlewareCommunicatRequest();

            statSeter.WilSendMiddleware2MiddlewareMessage(mtPkg.TargetDevice, mtPkg);

            BinTransferLayer   btlprocessor = _middlewareCorelogicLayer.BinTransferProcessor;
            ServerReplyPackage replyServPkg = null;

            try
            {
                replyServPkg = btlprocessor.SynSendMessage(wilSendScsMsg, 100000);
            }
            catch (System.Exception ex)
            {
                //TODO
                throw new MiddlewareTransferErrorExcetion(ex);
            }
            //分析服务端报文
            IMiddleware2MiddlewareCommunicatReply replyInterface = replyServPkg.Active_Middleware2MiddlewareCommunicatReply();
            bool   ret;
            string detail;

            try
            {
                replyInterface.SendMiddlewareMsgOprRet(out ret, out detail);
            }
            catch (Exception ex)
            {
                throw new MiddlewareTransferErrorExcetion(ex.ToString());
            }
            if (true == ret)
            {
                //noting to do
            }
            else
            {
                throw new MiddlewareTransferErrorExcetion(detail);
            }
        }
        protected void CoSynSendRequest(RequestCommunicatePackage communicator, int timeMillionsecond)
        {
            if (communicator.WaitResponse)
            {
                RequestPackage reqtPkg = new RequestPackage(_selfDevice,
                                                            communicator.CommunicationName,
                                                            communicator.WaitResponse,
                                                            communicator.ParamPackage.ParamDefalutValues);

                C2CRequestPackage c2cReqtPkg = new C2CRequestPackage(_selfDevice,
                                                                     "outside message sent",
                                                                     communicator.WaitResponse,
                                                                     null);
                c2cReqtPkg.OutSideMessage = reqtPkg;
                RequestMTPackage mtReqtPkg = new RequestMTPackage(c2cReqtPkg,
                                                                  _selfDevice,
                                                                  communicator.TargetDevice,
                                                                  c2cReqtPkg.WaittingResponse);
                MiddlewareTransferPackage mtReplyBasePkg = null;

                //set param-time to wait this c2c response.
                mtReplyBasePkg = _middlewareCommunicateProcessor.SynSendMessage(mtReqtPkg, timeMillionsecond);

                if (null != (mtReplyBasePkg as ReplyMTPackage))
                {
                    ReplyMTPackage  mtReplyPkg  = mtReplyBasePkg as ReplyMTPackage;
                    C2CReplyPackage c2cReplyPkg = mtReplyPkg.C2CReplyPackage;
                    if ((null != c2cReplyPkg) && (null != c2cReplyPkg.OutSideMessage))
                    {
                        ReplyPackage outsideReplyPkg = c2cReplyPkg.OutSideMessage;
                        communicator.ResponsePackage = outsideReplyPkg;
                    }
                    else
                    {
                        throw new ArgumentNullException("应答报文C2CReplyPackage/C2CReplyPackage.OutSideMessage字段空");
                    }
                }
                else
                {
                    throw new NotImplementedException("暂不支持打回RequestMTPackage类型");
                }
            }
            else
            {
                throw new MiddlewareCommunicatErrorExcetion("同步调用而不请求应答是一个错误");
            }
        }
Esempio n. 5
0
        internal MiddlewareTransferPackage DeserializeMessage(byte[] bytes)
        {
            if ((null == bytes) || (0 == bytes.Length))
            {
                throw new Exception("Bin数据不存在或为空");
            }
            byte bytOpjTypeCodec = bytes[0];

            switch (bytOpjTypeCodec)
            {
            case (byte)SerializObjectType.MiddlewareTransferPackage:
            {
                try
                {
                    byte[] bytObjContent = new byte[bytes.Length - 1];
                    Buffer.BlockCopy(bytes, 1, bytObjContent, 0, bytObjContent.Length);

                    CCCommunicateClass.Seria_MiddlewareTransferPackage middlewareSerializeObj = null;
                    MiddlewareTransferPackage retPkg = new MiddlewareTransferPackage();
                    using (MemoryStream m = new MemoryStream(bytObjContent))
                    {
                        CJNet_SerializeTool deSerializeTool = new CJNet_SerializeTool();
                        middlewareSerializeObj = deSerializeTool.Deserialize(m, null, typeof(CCCommunicateClass.Seria_MiddlewareTransferPackage))
                                                 as CCCommunicateClass.Seria_MiddlewareTransferPackage;
                    }
                    retPkg.ParseSerializeData(middlewareSerializeObj);
                    return(retPkg);
                }
                catch (System.Exception ex)
                {
                    throw new Exception("针对Bin数据尝试反序列失败,请检验数据格式: " + ex.ToString());
                }
            }

            case (byte)SerializObjectType.RequestMTPackage:
            {
                try
                {
                    byte[] bytObjContent = new byte[bytes.Length - 1];
                    Buffer.BlockCopy(bytes, 1, bytObjContent, 0, bytObjContent.Length);

                    CCCommunicateClass.Seria_RequestMTPackage reqtMTPSerializeObj = null;
                    RequestMTPackage retPkg = new RequestMTPackage();
                    using (MemoryStream m = new MemoryStream(bytObjContent))
                    {
                        CJNet_SerializeTool deSerializeTool = new CJNet_SerializeTool();
                        reqtMTPSerializeObj = deSerializeTool.Deserialize(m, null, typeof(CCCommunicateClass.Seria_RequestMTPackage)) as CCCommunicateClass.Seria_RequestMTPackage;
                    }
                    retPkg.ParseSerializeData(reqtMTPSerializeObj);
                    return(retPkg);
                }
                catch (System.Exception ex)
                {
                    throw new Exception("针对Bin数据尝试反序列失败,请检验数据格式: " + ex.ToString());
                }
            }

            case (byte)SerializObjectType.ReplyMTPackage:
            {
                try
                {
                    byte[] bytObjContent = new byte[bytes.Length - 1];
                    Buffer.BlockCopy(bytes, 1, bytObjContent, 0, bytObjContent.Length);

                    CCCommunicateClass.Seria_ReplyMTPackage replyMTPSerializeObj = null;
                    ReplyMTPackage retPkg = new ReplyMTPackage();
                    using (MemoryStream m = new MemoryStream(bytObjContent))
                    {
                        CJNet_SerializeTool deSerializeTool = new CJNet_SerializeTool();
                        replyMTPSerializeObj = deSerializeTool.Deserialize(m, null, typeof(CCCommunicateClass.Seria_ReplyMTPackage)) as CCCommunicateClass.Seria_ReplyMTPackage;
                    }
                    retPkg.ParseSerializeData(replyMTPSerializeObj);
                    return(retPkg);
                }
                catch (System.Exception ex)
                {
                    throw new Exception("针对Bin数据尝试反序列失败,请检验数据格式: " + ex.ToString());
                }
            }

            default:
            {
                throw new NotImplementedException("二进制数据指向无法识别的类型");
            }
            }
        }
Esempio n. 6
0
        private MiddlewareTransferPackage __SendMessageAndWattingForResponse(MiddlewareTransferPackage msg, int timeoutMilliseconds)
        {
            WaitingMessage waitMsg = new WaitingMessage();

            lock (_synWriteLockObject)
            {
                _synWattingMiddlewareReplyMessages[msg.MessageId] = waitMsg;
            }

            //send message
            bool mustWaitReponse = true;
            ServerRequestPackage wilSendServMsg = new ServerRequestPackage(mustWaitReponse);

            //配置为中间件传输包
            IMiddleware2MiddlewareCommunicatRequest statSetter = wilSendServMsg.Active_MiddlewareCommunicatRequest();

            statSetter.WilSendMiddleware2MiddlewareMessage(msg.TargetDevice, msg);

            BinTransferLayer   btlpeocessor = _middlewareCorelogicLayer.BinTransferProcessor;
            ServerReplyPackage replyServPkg = null;

            try
            {
                replyServPkg = btlpeocessor.SynSendMessage(wilSendServMsg, 100000);
            }
            catch (System.Exception ex)
            {
                //释放锁记录
                lock (_synWriteLockObject)
                {
                    _synWattingMiddlewareReplyMessages.Remove(msg.MessageId);
                }
                throw new MiddlewareTransferErrorExcetion(ex.ToString());
            }
            //分析服务端报文
            IMiddleware2MiddlewareCommunicatReply replyInterface = replyServPkg.Active_Middleware2MiddlewareCommunicatReply();
            bool   ret;
            string detail;

            replyInterface.SendMiddlewareMsgOprRet(out ret, out detail);
            if (true == ret)
            {
                //noting to do
            }
            else
            {
                throw new MiddlewareTransferErrorExcetion(detail);
            }

            //wait for the recived event
            waitMsg.WaitEvent.Wait(timeoutMilliseconds);

            //Check for exceptions
            switch (waitMsg.State)
            {
            case MiddlewareTransferServerStateInfo.WaittingForResponse:
            {
                //同步超时
                lock (_synWriteLockObject)
                {
                    _synWattingMiddlewareReplyMessages.Remove(msg.MessageId);
                }
                throw new MiddlewareTransferErrorExcetion(MiddlewareTransferServerStateInfo.TimeOut.ToString());
            }

            case MiddlewareTransferServerStateInfo.ResponseReceived:
            {
                lock (_synWriteLockObject)
                {
                    _synWattingMiddlewareReplyMessages.Remove(msg.MessageId);
                }
                break;
            }
            }
            return(waitMsg.ResponseMessage);
        }
Esempio n. 7
0
 /// <summary>
 /// 阻塞式执行一次中间层报文通讯
 /// </summary>
 /// <param name="msg">发起方报文</param>
 /// <returns>远程中间件响应报文</returns>
 private MiddlewareTransferPackage __SendMessageAndWattingForResponse(MiddlewareTransferPackage msg)
 {
     return(__SendMessageAndWattingForResponse(msg, -1));
 }
Esempio n. 8
0
        private void __ProcessMiddlewareMessageRecived(MiddlewareTransferPackage mtMsg)
        {
            if (mtMsg is RequestMTPackage)
            {
                //向上请求消息
                _middlewareCorelogicLayer.MiddlewareTransferMessageRecived(mtMsg as RequestMTPackage);
            }
            if (mtMsg is ReplyMTPackage)
            {
                //Noting to do, push up
                ReplyMTPackage mtReplyPkg         = mtMsg as ReplyMTPackage;
                bool           bAsynArrIndexExist = false;
                bool           bSynArrIndexExist  = false;
                lock (_synReadLockObject)
                {
                    if (false == string.IsNullOrEmpty(mtReplyPkg.RepliedMessageId))
                    {
                        bAsynArrIndexExist = _asynWattingMiddlewareReplyMessages.ContainsKey(mtReplyPkg.RepliedMessageId);
                        bSynArrIndexExist  = _synWattingMiddlewareReplyMessages.ContainsKey(mtReplyPkg.RepliedMessageId);
                    }
                }
                if ((false == bAsynArrIndexExist) &&
                    (false == bSynArrIndexExist))
                {
                    //一个未知的应答消息,没有索引,丢弃
                }
                else
                {
                    if (true == bSynArrIndexExist)
                    {
                        //处理同步消息
                        WaitingMessage waitingMessage = null;
                        lock (_synReadLockObject)
                        {
                            if (_synWattingMiddlewareReplyMessages.ContainsKey(mtReplyPkg.RepliedMessageId))
                            {
                                waitingMessage = _synWattingMiddlewareReplyMessages[mtReplyPkg.RepliedMessageId] as WaitingMessage;
                            }
                        }

                        //If there is a thread waiting for this response message, pulse it
                        if (waitingMessage != null)
                        {
                            waitingMessage.ResponseMessage = mtReplyPkg;
                            waitingMessage.State           = MiddlewareTransferServerStateInfo.ResponseReceived;
                            waitingMessage.WaitEvent.Set();
                            return;
                        }
                    }
                    else
                    {
                        //处理异步消息
                        MiddlewareTransferPackage sourMtPkg = _asynWattingMiddlewareReplyMessages[mtReplyPkg.RepliedMessageId] as MiddlewareTransferPackage;
                        _middlewareCorelogicLayer.MiddlewareTransferMessageRecived(sourMtPkg, mtReplyPkg);

                        //清理资源
                        bool havWattingRecored;
                        lock (_synReadLockObject)
                        {
                            havWattingRecored = _asynWattingMiddlewareReplyMessages.ContainsKey(mtReplyPkg.RepliedMessageId);
                        }
                        if (havWattingRecored)
                        {
                            _asynWattingMiddlewareReplyMessages.Remove(mtReplyPkg.RepliedMessageId);
                        }
                    }
                }
            }
        }
Esempio n. 9
0
 /// <summary>
 /// 阻塞式执行一次消息发送请求
 /// </summary>
 /// <param name="mtPkg">发往远程中间件设备的消息包</param>
 /// <returns>远程中间件返回的报文包</returns>
 ///
 internal MiddlewareTransferPackage SynSendMessage(MiddlewareTransferPackage mtPkg)
 {
     return(SynSendMessage(mtPkg, -1));
 }
 /// <summary>
 /// 中间件传输层Error信息通知
 /// </summary>
 /// <param name="sourMtPkg">该错误匹配的一次中间件通讯发起报文</param>
 /// <param name="errorInfoPkg">错误信息包装类</param>
 internal void MiddlewareTransferErrorRecived(MiddlewareTransferPackage sourMtPkg, MiddlewareTransferErrorExcetion errExInfo)
 {
     throw new NotImplementedException("目前的调用机制暂时使用同步接口对BinLayer进行操作,故不应触发到该分支");
 }
 /// <summary>
 /// 中间件传输层消息通知
 /// </summary>
 /// <param name="sourMtPkg">发起中间件通讯的数据包</param>
 /// <param name="targtMtPkh">匹配的应答包</param>
 internal void MiddlewareTransferMessageRecived(MiddlewareTransferPackage sourMtPkg, MiddlewareTransferPackage targtMtPkh)
 {
     throw new NotImplementedException("目前的调用机制暂时不需要使用MiddlewareCommunicat的异步接口,故不应触发到该分支");
 }
        private void __CoAsynSendRequestRunning(RequestCommunicatePackage communicator)
        {
            RequestPackage reqtPkg = new RequestPackage(_selfDevice,
                                                        communicator.CommunicationName,
                                                        communicator.WaitResponse,
                                                        communicator.ParamPackage.ParamDefalutValues);

            C2CRequestPackage c2cReqtPkg = new C2CRequestPackage(_selfDevice,
                                                                 "outside message sent",
                                                                 communicator.WaitResponse,
                                                                 null);

            c2cReqtPkg.OutSideMessage = reqtPkg;
            RequestMTPackage mtReqtPkg = new RequestMTPackage(c2cReqtPkg,
                                                              _selfDevice,
                                                              communicator.TargetDevice,
                                                              c2cReqtPkg.WaittingResponse);

            if (communicator.WaitResponse)
            {
                MiddlewareTransferPackage mtReplyBasePkg = null;
                try
                {
                    //100s limited time to wait this c2c response.
                    mtReplyBasePkg = _middlewareCommunicateProcessor.SynSendMessage(mtReqtPkg, 10000);
                }
                catch (System.Exception ex)
                {
                    //throw new MiddlewareCommunicatErrorExcetion(ex.ToString());
                    this.CoMiddleware2MiddlewareAsynReqtCommunicatErrorRecived_OutsideNotify(communicator,
                                                                                             new MiddlewareCommunicatErrorExcetion(ex.ToString()));
                }
                if (null != (mtReplyBasePkg as ReplyMTPackage))
                {
                    ReplyMTPackage  mtReplyPkg  = mtReplyBasePkg as ReplyMTPackage;
                    C2CReplyPackage c2cReplyPkg = mtReplyPkg.C2CReplyPackage;
                    if ((null != c2cReplyPkg) && (null != c2cReplyPkg.OutSideMessage))
                    {
                        ReplyPackage outsideReplyPkg = c2cReplyPkg.OutSideMessage;
                        communicator.ResponsePackage = outsideReplyPkg;
                        //asyn outside notify
                        if (null != communicator.AsynchronousReponseCame)
                        {
                            communicator.AsynchronousReponseCame(communicator, new AsynReplyCommunicatePackage(outsideReplyPkg));
                        }
                    }
                    else
                    {
                        ArgumentNullException ex = new ArgumentNullException("应答报文C2CReplyPackage/C2CReplyPackage.OutSideMessage字段空");
                        this.CoMiddleware2MiddlewareAsynReqtCommunicatErrorRecived_OutsideNotify(communicator,
                                                                                                 new MiddlewareCommunicatErrorExcetion(ex.ToString()));
                    }
                }
                else
                {
                    NotImplementedException ex = new NotImplementedException("暂不支持打回RequestMTPackage类型");
                    this.CoMiddleware2MiddlewareAsynReqtCommunicatErrorRecived_OutsideNotify(communicator,
                                                                                             new MiddlewareCommunicatErrorExcetion(ex.ToString()));
                }
            }
            else
            {
                try
                {
                    _middlewareCommunicateProcessor.AsynSendMessage(mtReqtPkg);
                }
                catch (System.Exception ex)
                {
                    //throw new MiddlewareCommunicatErrorExcetion(ex.ToString());
                    this.CoMiddleware2MiddlewareAsynReqtCommunicatErrorRecived_OutsideNotify(communicator,
                                                                                             new MiddlewareCommunicatErrorExcetion(ex.ToString()));
                }
            }
        }
Esempio n. 13
0
        public void Listen(ClientDevice messenger, BaseMessageType typMsg)
        {
            if (mListeningDevice2MsgID.ContainsKey(messenger.Detail) &&
                (mListeningDevice2MsgID[messenger.Detail] as List <uint>).Contains(typMsg.Id))
            {
                throw new InvalidOperationException("该设备消息已被监听");
            }

            C2CRequestPackage listenerVertificationRequestPkg =
                new C2CRequestPackage(mCoreLogicProcessor.SelfDevice,
                                      "ListenerVertificationRequest",
                                      true,
                                      new Dictionary <string, byte[]>()
            {
                { "MessageType",
                  BitConverter.GetBytes(typMsg.Id) }
            });
            RequestMTPackage mtReqtPkg = new RequestMTPackage(listenerVertificationRequestPkg,
                                                              mCoreLogicProcessor.SelfDevice,
                                                              messenger,
                                                              true);

            //验证流程
            MiddlewareTransferPackage mtReplyBasePkg = null;

            try
            {
                //100s limited time to wait this c2c response.
                mtReplyBasePkg = mMiddlewareCommunicateProcessor.SynSendMessage(mtReqtPkg, 10000);
            }catch (Exception ex)
            {
                throw new Exception("尝试监听一个设备消息时遭遇网络异常:" + ex.ToString());
            }
            ReplyMTPackage  mtReplyPkg  = mtReplyBasePkg as ReplyMTPackage;
            C2CReplyPackage c2cReplyPkg = mtReplyPkg.C2CReplyPackage;

            if (Communication.Package.ReplyPackage.Middleware_ReplyInfo.S_OK == c2cReplyPkg.ReplyState)
            {
                //加入监听群组
                string      gourp_detail   = Encoding.ASCII.GetString(c2cReplyPkg.ParamDefalutValues["group_detail"]);
                GroupDevice wilListenGroup = null;
                try
                {
                    wilListenGroup = mGroupCommunicateProcessor.GetGroup(gourp_detail);
                    mGroupCommunicateProcessor.JoinGroup(wilListenGroup,
                                                         Communication.CommunicationConfig.GroupMemberRole.Listener);
                }catch (Exception ex)
                {
                    throw new Exception("尝试监听一个设备消息时遭遇网络异常:" + ex.ToString());
                }

                if (!mListeningDevice2MsgID.ContainsKey(messenger.Detail))
                {
                    mListeningDevice2MsgID.Add(messenger.Detail, new List <uint>());
                }
                (mListeningDevice2MsgID[messenger.Detail] as List <uint>).Add(typMsg.Id);

                mListeningGroup2Device.Add(wilListenGroup.Detail, messenger);
            }
            else
            {
                throw new Exception("尝试监听一个设备消息时遭遇网络异常:" +
                                    Encoding.UTF8.GetString(c2cReplyPkg.ParamDefalutValues["excetion_detail"]));
            }
        }