OuterMessageDispatcher.cs 2.4 KB
Newer Older
1
using System;
2
using ETModel;
3

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