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); }
/// <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; } } } }