public void Dispatch(Session session, PacketInfo packetInfo) { if (OpcodeHelper.IsClientHotfixMessage(packetInfo.Opcode)) { HotfixCallback.Invoke(session, packetInfo); return; } Type messageType = Game.Scene.GetComponent <OpcodeTypeComponent>().GetType(packetInfo.Opcode); IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(messageType, packetInfo.Bytes, packetInfo.Index, packetInfo.Length); // 如果是帧同步消息,交给ClientFrameComponent处理 FrameMessage frameMessage = message as FrameMessage; if (frameMessage != null) { Game.Scene.GetComponent <ClientFrameComponent>().Add(session, frameMessage); return; } // 普通消息或者是Rpc请求消息 MessageInfo messageInfo = new MessageInfo(packetInfo.RpcId, packetInfo.Opcode, message); Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, messageInfo); }
private void Run(Packet packet) { if (packet.Length < Packet.MinSize) { Log.Error($"message error length < {Packet.MinSize}, ip: {this.RemoteAddress}"); this.Network.Remove(this.Id); return; } byte flag = packet.Flag(); ushort opcode = packet.Opcode(); PacketInfo packetInfo = new PacketInfo { Opcode = opcode, Bytes = packet.Bytes }; if ((flag & 0xC0) > 0) { uint rpcId = packet.RpcId(); packetInfo.RpcId = rpcId; packetInfo.Index = Packet.RpcIdIndex + 4; packetInfo.Length = (ushort)(packet.Length - packetInfo.Index); // flag第2位表示这是rpc返回消息 if ((flag & 0x40) > 0) { Action <PacketInfo> action; if (!this.requestCallback.TryGetValue(rpcId, out action)) { return; } this.requestCallback.Remove(rpcId); action(packetInfo); return; } } else { packetInfo.RpcId = 0; packetInfo.Index = Packet.RpcIdIndex; packetInfo.Length = (ushort)(packet.Length - packetInfo.Index); } this.Network.MessageDispatcher.Dispatch(this, packetInfo); }