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