SessionStreamDispatcherServerOuter.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.IO;
  3. namespace ET
  4. {
  5. [SessionStreamDispatcher(SessionStreamDispatcherType.SessionStreamDispatcherServerOuter)]
  6. public class SessionStreamDispatcherServerOuter: ISessionStreamDispatcher
  7. {
  8. public void Dispatch(Session session, MemoryStream memoryStream)
  9. {
  10. ushort opcode = BitConverter.ToUInt16(memoryStream.GetBuffer(), Packet.KcpOpcodeIndex);
  11. Type type = OpcodeTypeComponent.Instance.GetType(opcode);
  12. object message = MessageSerializeHelper.DeserializeFrom(opcode, type, memoryStream);
  13. if (message is IResponse response)
  14. {
  15. session.OnRead(opcode, response);
  16. return;
  17. }
  18. OpcodeHelper.LogMsg(session.DomainZone(), opcode, message);
  19. DispatchAsync(session, opcode, message).Coroutine();
  20. }
  21. public async ETTask DispatchAsync(Session session, ushort opcode, object message)
  22. {
  23. // 根据消息接口判断是不是Actor消息,不同的接口做不同的处理
  24. switch (message)
  25. {
  26. case IActorLocationRequest actorLocationRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
  27. {
  28. long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
  29. int rpcId = actorLocationRequest.RpcId; // 这里要保存客户端的rpcId
  30. long instanceId = session.InstanceId;
  31. IResponse response = await ActorLocationSenderComponent.Instance.Call(unitId, actorLocationRequest);
  32. response.RpcId = rpcId;
  33. // session可能已经断开了,所以这里需要判断
  34. if (session.InstanceId == instanceId)
  35. {
  36. session.Reply(response);
  37. }
  38. break;
  39. }
  40. case IActorLocationMessage actorLocationMessage:
  41. {
  42. long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
  43. ActorLocationSenderComponent.Instance.Send(unitId, actorLocationMessage);
  44. break;
  45. }
  46. case IActorRequest actorRequest: // 分发IActorRequest消息,目前没有用到,需要的自己添加
  47. {
  48. break;
  49. }
  50. case IActorMessage actorMessage: // 分发IActorMessage消息,目前没有用到,需要的自己添加
  51. {
  52. break;
  53. }
  54. default:
  55. {
  56. // 非Actor消息
  57. MessageDispatcherComponent.Instance.Handle(session, opcode, message);
  58. break;
  59. }
  60. }
  61. }
  62. }
  63. }