public void Send(byte nFlag, IMessage rMessage) { NetworkOpcodeTypes rOpcodeTypes = this.mParent.OpcodeTypes; ushort nOpcode = rOpcodeTypes.GetOpcode(rMessage.GetType()); byte[] rBytes = this.mParent.MessagePacker.SerializeToByteArray(rMessage); Send(nFlag, nOpcode, rBytes); }
private void Run(Packet rPacket) { if (rPacket.Length < Packet.MinSize) { Debug.LogError($"message error length < {Packet.MinSize}, ip: {this.RemoteAddress}"); this.mParent.Remove(this.Id); return; } byte nFlag = rPacket.Flag; ushort nOpcode = rPacket.Opcode; if (NetworkOpcodeTypes.IsClientHotfixMessage(nOpcode)) { this.mParent.MessageDispatcher.Dispatch(this, rPacket); return; } // flag第一位为1表示这是rpc返回消息,否则交由MessageDispatcher分发 if ((nFlag & 0x01) == 0) { this.mParent.MessageDispatcher.Dispatch(this, rPacket); return; } NetworkOpcodeTypes rOpcodeTypeComponent = this.mParent.OpcodeTypes; Type rResponseType = rOpcodeTypeComponent.GetType(nOpcode); object rMessage = this.mParent.MessagePacker.DeserializeFrom(rResponseType, rPacket.Bytes, Packet.Index, rPacket.Length - Packet.Index); //Log.Debug($"recv: {JsonHelper.ToJson(message)}"); IResponse rResponse = rMessage as IResponse; if (rResponse == null) { throw new Exception($"flag is response, but message is not! {nOpcode}"); } Action <IResponse> rAction; if (!this.mRequestCallback.TryGetValue(rResponse.RpcId, out rAction)) { return; } this.mRequestCallback.Remove(rResponse.RpcId); rAction(rResponse); }
public void Dispatch(NetworkSession rSession, Packet rPacket) { object rMessage; try { if (NetworkOpcodeTypes.IsClientHotfixMessage(rPacket.Opcode)) { // 处理热更新的消息分发 //if (mHotfixDispatchObject != null) //{ // mHotfixDispatchObject.Invoke("Dispatch", rSession, rPacket); //} return; } NetworkOpcodeTypes rOpcodeTypes = rSession.Parent.OpcodeTypes; Type rResponseType = rOpcodeTypes.GetType(rPacket.Opcode); rMessage = rSession.Parent.MessagePacker.DeserializeFrom(rResponseType, rPacket.Bytes, Packet.Index, rPacket.Length - Packet.Index); } catch (Exception e) { // 出现任何解析消息异常都要断开Session,防止客户端伪造消息 Debug.LogError(e); rSession.Error = NetworkErrorCode.ERR_PacketParserError; rSession.Parent.Remove(rSession.Id); return; } // 如果是帧同步消息,交给ClientFrameComponent处理 //FrameMessage frameMessage = rMessage as FrameMessage; //if (frameMessage != null) //{ // Game.Scene.GetComponent<ClientFrameComponent>().Add(session, frameMessage); // return; //} // 普通消息或者是Rpc请求消息 EventManager.Instance.Distribute(rPacket.Opcode, rMessage); }
public void Initialize(NetworkProtocol rProtocol) { this.OpcodeTypes = new NetworkOpcodeTypes(); this.OpcodeTypes.Initialize(); this.MessageDispatcher = new NetworkClientDispatcher(); this.MessagePacker = new NetworkMessagePacker(); switch (rProtocol) { case NetworkProtocol.TCP: this.mService = new TService(); break; case NetworkProtocol.KCP: this.mService = new KService(); break; default: throw new ArgumentOutOfRangeException(); } }