/// <summary>
 /// 获取远程表达式数据
 /// </summary>
 /// <param name="data"></param>
 internal void GetRemoteExpression(ref SubArray<byte> data)
 {
     AutoCSer.Net.TcpServer.ReturnType returnType = AutoCSer.Net.TcpServer.ReturnType.Unknown;
     try
     {
         RemoteExpression.ClientNode inputParameter = default(RemoteExpression.ClientNode);
         if (DeSerialize(ref data, ref inputParameter, false))
         {
             if (Server.ServerAttribute.RemoteExpressionTask == TcpServer.ServerTaskType.Synchronous)
             {
                 TcpServer.ReturnValue<RemoteExpression.ReturnValue.Output> outputParameter = new RemoteExpression.ReturnValue.Output { Return = inputParameter.GetReturnValue() };
                 Push<RemoteExpression.ReturnValue.Output>(ServerSocket.CommandIndex, IsBuildOutputThread ? RemoteExpression.ReturnValue.Output.OutputThreadInfo : RemoteExpression.ReturnValue.Output.OutputInfo, ref outputParameter);
             }
             else (AutoCSer.Threading.RingPool<GetRemoteExpressionServerCall>.Default.Pop() ?? new GetRemoteExpressionServerCall()).Set(this, ref Server.ServerAttribute, ref inputParameter);
             return;
         }
         returnType = AutoCSer.Net.TcpServer.ReturnType.ServerDeSerializeError;
     }
     catch (Exception error)
     {
         returnType = AutoCSer.Net.TcpServer.ReturnType.ServerException;
         AddLog(error);
     }
     Push(returnType);
 }
Beispiel #2
0
        internal void Set(ServerSocketSender sender, ref TcpServer.ServerAttributeCache attribute, ref RemoteExpression.ClientNode inputParameter)
        {
            this.Sender         = sender;
            CommandIndex        = sender.ServerSocket.CommandIndex;
            this.inputParameter = inputParameter;
            switch (attribute.RemoteExpressionTask)
            {
            case TcpServer.ServerTaskType.ThreadPool: if (!System.Threading.ThreadPool.QueueUserWorkItem(ThreadPoolCall))
                {
                    AutoCSer.Threading.TaskSwitchThreadArray.Default.CurrentThread.Add(this);
                }
                return;

            case TcpServer.ServerTaskType.Timeout: AutoCSer.Threading.TaskSwitchThreadArray.Default.CurrentThread.Add(this); return;

            case TcpServer.ServerTaskType.TcpTask: TcpServer.ServerCallThreadArray.Default.CurrentThread.Add(this); return;

            case TcpServer.ServerTaskType.TcpQueue: TcpServer.ServerCallQueue.Default.Add(this); return;

            case TcpServer.ServerTaskType.TcpQueueLink: TcpServer.ServerCallQueue.DefaultLink.Add(this); return;

            case TcpServer.ServerTaskType.Queue:
                if (attribute.RemoteExpressionCallQueueIndex == 0)
                {
                    sender.Server.CallQueue.Add(this);
                }
                else
                {
                    sender.Server.CallQueueArray[attribute.RemoteExpressionCallQueueIndex].Key.Add(this);
                }
                return;

            case TcpServer.ServerTaskType.QueueLink:
                if (attribute.RemoteExpressionCallQueueIndex == 0)
                {
                    sender.Server.CallQueueLink.Add(this);
                }
                else
                {
                    sender.Server.CallQueueArray[attribute.RemoteExpressionCallQueueIndex].Value.Add(this);
                }
                return;
            }
        }
 /// <summary>
 /// 获取远程表达式数据
 /// </summary>
 /// <param name="data"></param>
 /// <returns></returns>
 private bool getRemoteExpression(ref SubArray<byte> data)
 {
     AutoCSer.Net.TcpServer.ReturnType returnType = AutoCSer.Net.TcpServer.ReturnType.Unknown;
     try
     {
         RemoteExpression.ClientNode inputParameter = default(RemoteExpression.ClientNode);
         if (DeSerialize(ref data, ref inputParameter, false))
         {
             RemoteExpression.ReturnValue.Output outputParameter = new RemoteExpression.ReturnValue.Output { Return = inputParameter.GetReturnValue() };
             return Send(TcpSimpleServer.OutputInfo.RemoteExpression, ref outputParameter);
         }
         returnType = AutoCSer.Net.TcpServer.ReturnType.ServerDeSerializeError;
     }
     catch (Exception error)
     {
         returnType = AutoCSer.Net.TcpServer.ReturnType.ServerException;
         Log(error);
     }
     return SendOutput(returnType);
 }
        internal void Set(ServerSocketSender sender, TcpServer.ServerTaskType taskType, ref RemoteExpression.ClientNode inputParameter)
        {
            this.Sender         = sender;
            CommandIndex        = sender.ServerSocket.CommandIndex;
            this.inputParameter = inputParameter;
            switch (taskType)
            {
            case TcpServer.ServerTaskType.ThreadPool: if (!System.Threading.ThreadPool.QueueUserWorkItem(threadPoolCall))
                {
                    AutoCSer.Threading.LinkTask.Task.Add(this);
                }
                return;

            case TcpServer.ServerTaskType.Timeout: AutoCSer.Threading.LinkTask.Task.Add(this); return;

            case TcpServer.ServerTaskType.TcpTask: TcpServer.ServerCallTask.Task.Add(this); return;

            case TcpServer.ServerTaskType.TcpQueue: TcpServer.ServerCallQueue.Default.Add(this); return;

            case TcpServer.ServerTaskType.Queue: sender.Server.CallQueue.Add(this); return;
            }
        }
Beispiel #5
0
 public TcpServer.ReturnValue <RemoteExpression.ReturnValue> GetRemoteExpression(RemoteExpression.ClientNode node)
 {
     if (remoteExpressionServerNodeIdChecker != null)
     {
         return(node.Checker != remoteExpressionServerNodeIdChecker?getRemoteExpression(ref node) : new TcpServer.ReturnValue <RemoteExpression.ReturnValue>
         {
             Type = TcpServer.ReturnType.RemoteExpressionCheckerError
         });
     }
     return(new TcpServer.ReturnValue <RemoteExpression.ReturnValue> {
         Type = TcpServer.ReturnType.RemoteExpressionNotSupport
     });
 }
Beispiel #6
0
 /// <summary>
 /// 获取远程表达式数据
 /// </summary>
 /// <param name="node">远程表达式节点</param>
 /// <returns>返回值类型</returns>
 private TcpServer.ReturnValue <RemoteExpression.ReturnValue> getRemoteExpression(ref RemoteExpression.ClientNode node)
 {
     RemoteExpression.ReturnValue.Output outputParameter = default(RemoteExpression.ReturnValue.Output);
     TcpServer.ReturnType returnType = Get(RemoteExpression.ClientNode.CommandInfo, ref node, ref outputParameter);
     return(new TcpServer.ReturnValue <RemoteExpression.ReturnValue> {
         Type = returnType, Value = outputParameter.Return
     });
 }
Beispiel #7
0
        /// <summary>
        /// 获取客户端远程表达式节点
        /// </summary>
        /// <param name="node">远程表达式节点</param>
        /// <param name="clientNode">客户端远程表达式节点</param>
        /// <returns>返回值类型</returns>
        public TcpServer.ReturnType GetRemoteExpressionClientNode(RemoteExpression.Node node, out RemoteExpression.ClientNode clientNode)
        {
            RemoteExpressionServerNodeIdChecker checker = remoteExpressionServerNodeIdChecker;

            TcpServer.ReturnType returnType = checker.Check(node);
            clientNode = returnType == TcpServer.ReturnType.Success ? new RemoteExpression.ClientNode {
                Node = node, Checker = checker, ClientNodeId = node.ClientNodeId
            } : default(RemoteExpression.ClientNode);
            return(returnType);
        }
Beispiel #8
0
 public TcpServer.AwaiterBox <RemoteExpression.ReturnValue> GetRemoteExpressionAwaiter(RemoteExpression.ClientNode node)
 {
     return(Sender.GetRemoteExpressionAwaiter(node));
 }
Beispiel #9
0
 public TcpServer.ReturnValue <RemoteExpression.ReturnValue> GetRemoteExpression(RemoteExpression.ClientNode node)
 {
     return(Sender.GetRemoteExpression(node));
 }
Beispiel #10
0
 public TcpServer.ReturnType GetRemoteExpressionClientNode(RemoteExpression.Node node, out RemoteExpression.ClientNode clientNode)
 {
     return(Sender.GetRemoteExpressionClientNode(node, out clientNode));
 }