using Fleck; namespace BattleServer { /// /// 客户端链接对象 /// class Client { private IWebSocketConnection socket; public Client(IWebSocketConnection _socket) { socket = _socket; socket.OnBinary = doBinary; socket.OnClose = close; } private void close() { Service.Instance.Shutdown(this); } /// /// 接收rpc数据 /// /// private void doBinary(byte[] message) { BattleRpcMessage msg = ProtoDeSerialize(message); Console.WriteLine("接收到消息 {0}", msg.method); // Pb.BattleRpcMessage msg = Deserialize(message); Task t = Task.Run(() => { handle(msg); }); t.ContinueWith(r => { string Exception = Convert.ToString(t.Exception); Console.WriteLine("消息处理异常:" + Exception); }, TaskContinuationOptions.OnlyOnFaulted); } /// /// 处理远程请求 /// /// private void handle(BattleRpcMessage msg) { bool issucc; byte[] _msg; // long ts = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000; // Console.WriteLine("接收到战斗消息 1 {0}|{1}",msg.method,ts); switch (msg.method) { case "Check": //校验战报 BattleReport report = ProtoDeSerialize(msg.data.value); // ts = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000; // Console.WriteLine("接收到战斗消息 2 |{0}",ts); issucc = HotUpdateScripts.FightRunnerMgr.Instance.VerifyOnceFight(report); // ts = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000; // Console.WriteLine("接收到战斗消息 3 |{0}",ts); msg.data = new Google.Protobuf.WellKnownTypes.Any { type_url = "type.googleapis.com/BattleCheckResults", value = ProtoSerialize(new BattleCheckResults { ischeck = issucc }), }; _msg = ProtoSerialize(msg); // ts = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000; // Console.WriteLine("接收到战斗消息 4 |{0}",ts); socket.Send(_msg); break; case "Create": //创建战斗场景 BattleCreateServerReq CreateReq = ProtoDeSerialize(msg.data.value); issucc = HotUpdateScripts.FightRunnerMgr.Instance.CreatePvP(CreateReq.info, this.OnOutCmd, this.OnFinish); msg.data = new Google.Protobuf.WellKnownTypes.Any { type_url = "type.googleapis.com/BattleCreateServerResp", value = ProtoSerialize(new BattleCreateServerResp { issucc = issucc }), }; _msg = ProtoSerialize(msg); socket.Send(_msg); break; case "InCmd": //向战斗场景输入指令 BattleInCmdReq InCmdReq = ProtoDeSerialize(msg.data.value); issucc = HotUpdateScripts.FightRunnerMgr.Instance.PvpInput(InCmdReq.battleid, 0, InCmdReq.@in); msg.data = new Google.Protobuf.WellKnownTypes.Any { type_url = "type.googleapis.com/BattleCreateServerResp", value = ProtoSerialize(new BattleCreateServerResp { issucc = issucc }), }; _msg = ProtoSerialize(msg); socket.Send(_msg); break; } } private void OnOutCmd(string bid, BattleCmd cmd) { BattleRpcMessage msg = new BattleRpcMessage(); msg.method = "BattleOutCmd"; msg.data = new Google.Protobuf.WellKnownTypes.Any { type_url = "type.googleapis.com/BattleOutCmdPush", value = ProtoSerialize(new BattleOutCmdPush { battleid = bid, cmd = new List() { cmd }, }), }; byte[] data = ProtoSerialize(msg); socket.Send(data); } private void OnFinish(BattleCmd cmd) { ComEndFight _cmd = HotUpdateScripts.FightCmdUtil.PasreCmd(cmd) as ComEndFight; BattleRpcMessage msg = new BattleRpcMessage(); msg.method = "BattleFished"; msg.data = new Google.Protobuf.WellKnownTypes.Any { type_url = "type.googleapis.com/BattleFinishPush", value = ProtoSerialize(new BattleFinishPush { battleid = _cmd.fightId }), }; byte[] data = ProtoSerialize(msg); socket.Send(data); } /// /// 序列化并返回二进制 /// Serialize an Object and return byte[] /// /// /// public static byte[] ProtoSerialize(T obj) where T : class { using (var stream = new MemoryStream()) { ProtoBuf.Serializer.Serialize(stream, obj); return stream.ToArray(); } } /// /// 通过二进制反序列化 /// Deserialize with byte[] /// /// /// /// public static T ProtoDeSerialize(byte[] msg) where T : class { msg = msg == null ? new byte[] { } : msg; using (var ms = new MemoryStream(msg)) { var data = ProtoBuf.Serializer.Deserialize(ms); return data; } } } }