OuterMessageDispatcher.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using ETModel;
  3. namespace ETHotfix
  4. {
  5. public class OuterMessageDispatcher: IMessageDispatcher
  6. {
  7. public async void Dispatch(Session session, Packet packet)
  8. {
  9. object message;
  10. try
  11. {
  12. Type messageType = session.Network.Entity.GetComponent<OpcodeTypeComponent>().GetType(packet.Opcode);
  13. message = session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, packet.Offset, packet.Length);
  14. }
  15. catch (Exception e)
  16. {
  17. // 出现任何异常都要断开Session,防止客户端伪造消息
  18. Log.Error(e);
  19. session.Error = ErrorCode.ERR_PacketParserError;
  20. session.Network.Remove(session.Id);
  21. return;
  22. }
  23. //Log.Debug($"recv: {JsonHelper.ToJson(message)}");
  24. switch (message)
  25. {
  26. case IFrameMessage iFrameMessage: // 如果是帧消息,构造成OneFrameMessage发给对应的unit
  27. {
  28. long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
  29. ActorMessageSender actorMessageSender = Game.Scene.GetComponent<ActorMessageSenderComponent>().Get(unitId);
  30. // 这里设置了帧消息的id,防止客户端伪造
  31. iFrameMessage.Id = unitId;
  32. OneFrameMessage oneFrameMessage = new OneFrameMessage
  33. {
  34. Op = packet.Opcode,
  35. AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage)
  36. };
  37. actorMessageSender.Send(oneFrameMessage);
  38. return;
  39. }
  40. case IActorRequest iActorRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
  41. {
  42. long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
  43. ActorMessageSender actorMessageSender = Game.Scene.GetComponent<ActorMessageSenderComponent>().Get(unitId);
  44. int rpcId = iActorRequest.RpcId; // 这里要保存客户端的rpcId
  45. IResponse response = await actorMessageSender.Call(iActorRequest);
  46. response.RpcId = rpcId;
  47. session.Reply(response);
  48. return;
  49. }
  50. case IActorMessage iActorMessage: // gate session收到actor消息直接转发给actor自己去处理
  51. {
  52. long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
  53. ActorMessageSender actorMessageSender = Game.Scene.GetComponent<ActorMessageSenderComponent>().Get(unitId);
  54. actorMessageSender.Send(iActorMessage);
  55. return;
  56. }
  57. }
  58. Game.Scene.GetComponent<MessageDispatherComponent>().Handle(session, new MessageInfo(packet.Opcode, message));
  59. }
  60. }
  61. }