OuterMessageDispatcher.cs 2.4 KB

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