示例#1
0
 public ProxyFactory(ClientConfig config)
 {
     this.Config  = config;
     rpcContainer = new RpcContainer <IClentController>();
     rpcContainer.Load(config.BinPath);
     sessionId = new SessionId(1);
 }
示例#2
0
 public RpcServer(RpcServerConfig config, ILoger loger)
     : base(config, loger)
 {
     rpcConfig = config;
     rpcContainer = new RpcContainer<IServerController>();
     RpcFactory = new ProxyFactory(config);
 }
示例#3
0
 public override void OnDisConnect(ITcpClientSession session)
 {
     RpcContainer.DestroyScope(session.SessionId);
     foreach (var taskSource in taskDict.Values)
     {
         taskSource.SetException(new Exception("Disconnected with the server"));
     }
 }
示例#4
0
 protected void CallProcess(RpcCallData data)
 {
     try
     {
         IClentController controller = RpcContainer.GetController(SessionId, data.Controller.ToLower());
         string           key        = (data.Controller + ":" + data.Action).ToLower();
         var      method             = RpcContainer.GetMethod(key);
         object[] args = null;
         if (data.Arguments != null && data.Arguments.Count > 0)
         {
             args = new object[data.Arguments.Count];
             var types = GetParaTypeList(key);
             for (int i = 0; i < data.Arguments.Count; i++)
             {
                 var          arg    = data.Arguments[i];
                 MemoryStream stream = new MemoryStream(arg, 0, arg.Length);
                 var          obj    = Serializer.NonGeneric.Deserialize(types[i], stream);
                 args[i] = obj;
                 stream.Dispose();
             }
         }
         RpcReturnData result = new RpcReturnData()
         {
             Id = data.Id
         };
         object value = method.Invoke(controller, args);
         var    ms    = new MemoryStream();
         Serializer.Serialize(ms, value);
         byte[] bytes = new byte[ms.Position];
         Buffer.BlockCopy(ms.GetBuffer(), 0, bytes, 0, bytes.Length);
         result.Value = bytes;
         ms.Position  = 0;
         ms.WriteByte(2);
         Serializer.Serialize(ms, result);
         byte[] rBytes = new byte[ms.Position];
         Buffer.BlockCopy(ms.GetBuffer(), 0, rBytes, 0, rBytes.Length);
         SendAsync(rBytes);
         ms.Dispose();
     }
     catch (Exception e)
     {
         RpcErrorInfo error = new RpcErrorInfo()
         {
             Id = data.Id, Message = e.Message
         };
         var ms = new MemoryStream();
         ms.WriteByte(0);
         Serializer.Serialize(ms, error);
         byte[] rBytes = new byte[ms.Position];
         Buffer.BlockCopy(ms.GetBuffer(), 0, rBytes, 0, rBytes.Length);
         SendAsync(rBytes);
         ms.Dispose();
     }
 }
示例#5
0
        public List <Type> GetParaTypeList(string key)
        {
            List <Type> result;

            if (!methodParasDict.TryGetValue(key, out result))
            {
                result = RpcContainer.GetMethod(key).GetParameters().Select(p => p.ParameterType).ToList();
                methodParasDict.TryAdd(key, result);
            }
            return(result);
        }
示例#6
0
        public RpcTask Send(uint packetId, RpcTask task)
        {
            if (task.ExpireDate < DateTime.Now)
            {
                ProcessCompleteTask(task);
                return(task);
            }
            var container = new RpcContainer(task.Rpc.Argument);

            container.Id = (uint)task.Id;

            lock (lck)
            {
                RpcIds.Add(packetId);
            }
            RegisterTask(task);

            Session.Send(packetId, container);
            return(task);
        }
示例#7
0
 public RpcServer(RpcServerConfig config, ILoger loger) : base(config, loger)
 {
     rpcConfig    = config;
     rpcContainer = new RpcContainer <IServerController>();
     RpcFactory   = new ProxyFactory(config);
 }
示例#8
0
 public override void OnConnected(ITcpClientSession session)
 {
     RpcContainer.CreateScope(session.SessionId);
 }