ClientDispatcher.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using System;
  2. namespace ETModel
  3. {
  4. public class ClientDispatcher: IMessageDispatcher
  5. {
  6. public void Dispatch(Session session, Packet packet)
  7. {
  8. object message;
  9. try
  10. {
  11. if (OpcodeHelper.IsClientHotfixMessage(packet.Opcode))
  12. {
  13. session.GetComponent<SessionCallbackComponent>().MessageCallback.Invoke(session, packet);
  14. return;
  15. }
  16. OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
  17. Type responseType = opcodeTypeComponent.GetType(packet.Opcode);
  18. message = session.Network.MessagePacker.DeserializeFrom(responseType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);
  19. }
  20. catch (Exception e)
  21. {
  22. // 出现任何解析消息异常都要断开Session,防止客户端伪造消息
  23. Log.Error(e);
  24. session.Error = ErrorCode.ERR_PacketParserError;
  25. session.Network.Remove(session.Id);
  26. return;
  27. }
  28. // 如果是帧同步消息,交给ClientFrameComponent处理
  29. FrameMessage frameMessage = message as FrameMessage;
  30. if (frameMessage != null)
  31. {
  32. Game.Scene.GetComponent<ClientFrameComponent>().Add(session, frameMessage);
  33. return;
  34. }
  35. // 普通消息或者是Rpc请求消息
  36. MessageInfo messageInfo = new MessageInfo(packet.Opcode, message);
  37. Game.Scene.GetComponent<MessageDispatherComponent>().Handle(session, messageInfo);
  38. }
  39. }
  40. }