예제 #1
0
        /// <summary>
        /// 当接收到服务发来的数据包时,将触发此方法
        /// </summary>
        /// <param name="packet">数据包</param>
        protected override void OnRecvComplete(FastPacket packet)
        {
            var method = this.serverMethods.FirstOrDefault(item => item.ServiceAttribute.Command == packet.Command);

            if (method == null)
            {
                var exception = new Exception(string.Format("Command为{0}的数据包参数有误", packet.Command));
                this.OnException(exception, packet);
                return;
            }

            // 如果是Cmd值对应是Self类型方法 也就是客户端主动调用服务方法
            if (method.ServiceAttribute.Implement == Implements.Self)
            {
                this.InvokeService(method, packet);
                return;
            }

            // 如果是收到返回值 从回调表找出相关回调来调用
            var callBack = CallbackTable.Take(packet.HashCode);

            if (callBack != null)
            {
                callBack.Invoke(packet.GetBodyParameter().FirstOrDefault());
            }
        }
예제 #2
0
        /// <summary>
        /// 将数据发送到远程端
        /// 并返回结果数据任务
        /// </summary>
        /// <typeparam name="T">返回值类型</typeparam>
        /// <param name="cmd">数据包的命令值</param>
        /// <param name="parameters"></param>
        /// <returns>参数列表</returns>
        protected Task <T> InvokeRemote <T>(int cmd, params object[] parameters)
        {
            var taskSource = new TaskCompletionSource <T>();
            var packet     = new FastPacket(cmd);

            packet.SetBodyBinary(this.Serializer, parameters);

            // 发送之前记录回参数
            Action <byte[]> callBack = (bytes) =>
            {
                var result = (T)this.Serializer.Deserialize(bytes, typeof(T));
                taskSource.SetResult(result);
            };

            CallbackTable.Add(packet.HashCode, callBack);

            this.Send(packet);
            return(taskSource.Task);
        }