|
@@ -7,25 +7,37 @@ namespace ETHotfix
|
|
|
{
|
|
{
|
|
|
public async void Dispatch(Session session, Packet packet)
|
|
public async void Dispatch(Session session, Packet packet)
|
|
|
{
|
|
{
|
|
|
- ushort opcode = packet.Opcode;
|
|
|
|
|
- Type messageType = session.Network.Entity.GetComponent<OpcodeTypeComponent>().GetType(opcode);
|
|
|
|
|
- object message = session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);
|
|
|
|
|
-
|
|
|
|
|
|
|
+ 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;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
//Log.Debug($"recv: {JsonHelper.ToJson(message)}");
|
|
//Log.Debug($"recv: {JsonHelper.ToJson(message)}");
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
switch (message)
|
|
switch (message)
|
|
|
{
|
|
{
|
|
|
case IFrameMessage iFrameMessage: // 如果是帧消息,构造成OneFrameMessage发给对应的unit
|
|
case IFrameMessage iFrameMessage: // 如果是帧消息,构造成OneFrameMessage发给对应的unit
|
|
|
{
|
|
{
|
|
|
long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
|
|
long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
|
|
|
ActorMessageSender actorMessageSender = Game.Scene.GetComponent<ActorMessageSenderComponent>().Get(unitId);
|
|
ActorMessageSender actorMessageSender = Game.Scene.GetComponent<ActorMessageSenderComponent>().Get(unitId);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 这里设置了帧消息的id,防止客户端伪造
|
|
// 这里设置了帧消息的id,防止客户端伪造
|
|
|
iFrameMessage.Id = unitId;
|
|
iFrameMessage.Id = unitId;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
OneFrameMessage oneFrameMessage = new OneFrameMessage
|
|
OneFrameMessage oneFrameMessage = new OneFrameMessage
|
|
|
{
|
|
{
|
|
|
- Op = opcode,
|
|
|
|
|
|
|
+ Op = packet.Opcode,
|
|
|
AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage)
|
|
AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage)
|
|
|
};
|
|
};
|
|
|
actorMessageSender.Send(oneFrameMessage);
|
|
actorMessageSender.Send(oneFrameMessage);
|
|
@@ -35,11 +47,11 @@ namespace ETHotfix
|
|
|
{
|
|
{
|
|
|
long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
|
|
long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
|
|
|
ActorMessageSender actorMessageSender = Game.Scene.GetComponent<ActorMessageSenderComponent>().Get(unitId);
|
|
ActorMessageSender actorMessageSender = Game.Scene.GetComponent<ActorMessageSenderComponent>().Get(unitId);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
int rpcId = iActorRequest.RpcId; // 这里要保存客户端的rpcId
|
|
int rpcId = iActorRequest.RpcId; // 这里要保存客户端的rpcId
|
|
|
IResponse response = await actorMessageSender.Call(iActorRequest);
|
|
IResponse response = await actorMessageSender.Call(iActorRequest);
|
|
|
response.RpcId = rpcId;
|
|
response.RpcId = rpcId;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
session.Reply(response);
|
|
session.Reply(response);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
@@ -51,14 +63,8 @@ namespace ETHotfix
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- if (message != null)
|
|
|
|
|
- {
|
|
|
|
|
- Game.Scene.GetComponent<MessageDispatherComponent>().Handle(session, new MessageInfo(opcode, message));
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- throw new Exception($"message type error: {message.GetType().FullName}");
|
|
|
|
|
|
|
+
|
|
|
|
|
+ Game.Scene.GetComponent<MessageDispatherComponent>().Handle(session, new MessageInfo(packet.Opcode, message));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|