public static void LoadDynClass()
        {
            //已经注册过,直接返回
            if (DynTypeManager.GetClass("FileFragment") != null)
            {
                return;
            }

            //FileFragment对象
            DynClass fileFragment = new DynClass("FileFragment");

            DynProperty state      = new DynProperty(0, "State", DynType.Byte);
            DynProperty msgID      = new DynProperty(1, "MsgID", DynType.I32);
            DynProperty dataLength = new DynProperty(2, "DataLength", DynType.I32);
            DynProperty fileLength = new DynProperty(3, "FileLength", DynType.I64);
            DynProperty path       = new DynProperty(4, "Path", DynType.String);
            DynProperty fileName   = new DynProperty(5, "FileName", DynType.String);
            DynProperty extension  = new DynProperty(6, "Extension", DynType.String);
            DynProperty mD5        = new DynProperty(7, "MD5", DynType.String);
            DynProperty excepMsg   = new DynProperty(8, "ExcepMsg", DynType.String);
            DynProperty data       = new DynProperty(9, "Data", DynType.Binary);

            fileFragment.AddProperty(state);
            fileFragment.AddProperty(msgID);
            fileFragment.AddProperty(dataLength);
            fileFragment.AddProperty(fileLength);
            fileFragment.AddProperty(path);
            fileFragment.AddProperty(fileName);
            fileFragment.AddProperty(extension);
            fileFragment.AddProperty(mD5);
            fileFragment.AddProperty(excepMsg);
            fileFragment.AddProperty(data);

            DynTypeManager.RegistClass(fileFragment);
        }
示例#2
0
        /// <summary>
        /// 重载父类方法
        /// </summary>
        /// <param name="msgData">接收到的消息</param>
        private void DealMessage(object obj)
        {
            ZmqMessage zmqMessage = obj as ZmqMessage;
            //记录源地址和端口
            VirtuaIP originVIP  = new VirtuaIP(zmqMessage[1].Buffer);
            ushort   originPort = (ushort)BitConverter.ToInt16(zmqMessage[3].Buffer, 0);

            byte[] requestData = zmqMessage[zmqMessage.FrameCount - 1].Buffer;

            if (requestData != null && requestData.Length >= 4)
            {
                TSerializer serializer = new TBinarySerializer();
                serializer.FromBytes(requestData);

                // 获取消息
                TMessage msg = serializer.ReadMessageBegin();

                if (msg.Type == TMessageType.RpcCall || msg.Type == TMessageType.RpcOneway)
                {
                    //获取方法信息构造Method
                    string[]          temp           = msg.Name.Split('_');
                    DynMethodInstance methodInstance = null;
                    try
                    {
                        methodInstance = DynSerialize.ReadDynMethodInstance(serializer, temp[0], temp[1]);
                        serializer.ReadMessageEnd();
                        serializer.Flush();

                        Dictionary <string, object> paramValues = new Dictionary <string, object>();
                        //获取参数信
                        foreach (string paramName in methodInstance.DynMethod.GetParameterNames())
                        {
                            paramValues[paramName] = methodInstance[paramName];
                        }

                        string className      = InterfaceImplementMap.InterfaceAndImplementMap[temp[0]];
                        string methodFullName = className + "_" + temp[1];
                        //方法调用
                        object ret = DynTypeManager.MethodHandler(null, methodFullName, paramValues);

                        if (methodInstance.DynMethod.Result.DynType != DynType.Void)
                        {
                            methodInstance.Result = ret;
                        }

                        // 序列化返回结果
                        serializer = new TBinarySerializer();
                        TMessage respMsg = new TMessage(msg.Name, TMessageType.RpcReply, msg.MsgID, msg.LiveLife, "", "", "", "");
                        serializer.WriteMessageBegin(respMsg);
                        DynSerialize.WriteResult(serializer, methodInstance);
                        serializer.WriteMessageEnd();
                        byte[] respData = serializer.ToBytes();
                        serializer.Flush();

                        // 返回客户端
                        Send(originVIP, originPort, respData);
                    }
                    catch (Exception ex)
                    {
                        serializer.ReadMessageEnd();
                        serializer.Flush();

                        //如果服务端需要记录日志,则由本事件把异常信息发出
                        RaiseDealMessageExceptionEvent(ex);

                        byte[] returnData = ReturnExceptionToClient("RpcServer.DealMessageException", msg, ex.Message);
                        // 返回客户端
                        Send(originVIP, originPort, returnData);
                        return;
                    }
                }
            }
        }