提交 df588fd9 编写于 作者: T tanghai

客户端消息Handler还是需要带上Session,Session中可以保存消息上下文。

比如,做机器人,需要判断这个消息属于哪个机器人,这些信息可以保存在Session里面
上级 dcbd15bd
......@@ -4,16 +4,22 @@ namespace Model
{
public abstract class AMHandler<Message> : IMHandler where Message : AMessage
{
protected abstract void Run(Message message);
protected abstract void Run(Session session, Message message);
public void Handle(AMessage msg)
public void Handle(Session session, AMessage msg)
{
Message message = msg as Message;
if (message == null)
{
Log.Error($"消息类型转换错误: {msg.GetType().Name} to {typeof(Message).Name}");
return;
}
this.Run(message);
if (session.Id == 0)
{
Log.Error($"session disconnect {msg}");
return;
}
this.Run(session, message);
}
public Type GetMessageType()
......
......@@ -8,6 +8,10 @@ namespace Model
[BsonKnownTypes(typeof(AActorMessage))]
public abstract class AMessage
{
public override string ToString()
{
return MongoHelper.ToJson(this);
}
}
[ProtoContract]
......
......@@ -10,7 +10,7 @@ namespace Model
FrameMessage frameMessage = message as FrameMessage;
if (frameMessage != null)
{
Game.Scene.GetComponent<ClientFrameComponent>().Add(frameMessage);
Game.Scene.GetComponent<ClientFrameComponent>().Add(session, frameMessage);
return;
}
......@@ -18,7 +18,7 @@ namespace Model
if (message is AMessage || message is ARequest)
{
MessageInfo messageInfo = new MessageInfo(opcode, message);
Game.Scene.GetComponent<MessageDispatherComponent>().Handle(messageInfo);
Game.Scene.GetComponent<MessageDispatherComponent>().Handle(session, messageInfo);
return;
}
......
......@@ -4,7 +4,7 @@ namespace Model
{
public interface IMHandler
{
void Handle(AMessage message);
void Handle(Session session, AMessage message);
Type GetMessageType();
}
}
\ No newline at end of file
namespace Model
{
public struct SessionFrameMessage
{
public Session Session;
public FrameMessage FrameMessage;
}
[ObjectEvent]
public class ClientFrameComponentEvent : ObjectEvent<ClientFrameComponent>, IStart
{
......@@ -13,7 +19,7 @@
{
public int Frame;
public EQueue<FrameMessage> Queue = new EQueue<FrameMessage>();
public EQueue<SessionFrameMessage> Queue = new EQueue<SessionFrameMessage>();
public int count = 1;
......@@ -26,9 +32,9 @@
UpdateAsync();
}
public void Add(FrameMessage frameMessage)
public void Add(Session session, FrameMessage frameMessage)
{
this.Queue.Enqueue(frameMessage);
this.Queue.Enqueue(new SessionFrameMessage() {Session = session, FrameMessage = frameMessage});
}
public async void UpdateAsync()
......@@ -65,14 +71,14 @@
{
return;
}
FrameMessage frameMessage = this.Queue.Dequeue();
this.Frame = frameMessage.Frame;
SessionFrameMessage sessionFrameMessage = this.Queue.Dequeue();
this.Frame = sessionFrameMessage.FrameMessage.Frame;
for (int i = 0; i < frameMessage.Messages.Count; ++i)
for (int i = 0; i < sessionFrameMessage.FrameMessage.Messages.Count; ++i)
{
AFrameMessage message = frameMessage.Messages[i];
AFrameMessage message = sessionFrameMessage.FrameMessage.Messages[i];
Opcode opcode = Game.Scene.GetComponent<OpcodeTypeComponent>().GetOpcode(message.GetType());
Game.Scene.GetComponent<MessageDispatherComponent>().Handle(new MessageInfo() { Opcode= opcode, Message = message });
Game.Scene.GetComponent<MessageDispatherComponent>().Handle(sessionFrameMessage.Session, new MessageInfo() { Opcode= opcode, Message = message });
}
}
}
......
......@@ -11,7 +11,7 @@ namespace Model
/// </summary>
public interface IMessageMethod
{
void Run(AMessage a);
void Run(Session session, AMessage a);
}
public class IMessageMonoMethod : IMessageMethod
......@@ -23,9 +23,9 @@ namespace Model
this.iMHandler = iMHandler;
}
public void Run(AMessage a)
public void Run(Session session, AMessage a)
{
this.iMHandler.Handle(a);
this.iMHandler.Handle(session, a);
}
}
......@@ -45,7 +45,7 @@ namespace Model
this.param = new object[n];
}
public void Run(AMessage a)
public void Run(Session session, AMessage a)
{
this.param[0] = a;
this.appDomain.Invoke(this.method, this.instance, param);
......@@ -126,7 +126,7 @@ namespace Model
}
}
public void Handle(MessageInfo messageInfo)
public void Handle(Session session, MessageInfo messageInfo)
{
List<IMessageMethod> actions;
if (!this.handlers.TryGetValue(messageInfo.Opcode, out actions))
......@@ -139,7 +139,7 @@ namespace Model
{
try
{
ev.Run(messageInfo.Message);
ev.Run(session, messageInfo.Message);
}
catch (Exception e)
{
......
......@@ -5,7 +5,7 @@ namespace Model
[MessageHandler((int)Opcode.Actor_CreateUnits)]
public class Actor_CreateUnitsHandler : AMHandler<Actor_CreateUnits>
{
protected override void Run(Actor_CreateUnits message)
protected override void Run(Session session, Actor_CreateUnits message)
{
UnitComponent unitComponent = Game.Scene.GetComponent<UnitComponent>();
......
......@@ -3,7 +3,7 @@
[MessageHandler((int)Opcode.Actor_Test)]
public class Actor_TestHandler : AMHandler<Actor_Test>
{
protected override void Run(Actor_Test message)
protected override void Run(Session session, Actor_Test message)
{
Log.Debug(message.Info);
}
......
......@@ -5,7 +5,7 @@ namespace Model
[MessageHandler((int)Opcode.Frame_ClickMap)]
public class Frame_ClickMapHandler : AMHandler<Frame_ClickMap>
{
protected override void Run(Frame_ClickMap message)
protected override void Run(Session session, Frame_ClickMap message)
{
Unit unit = Game.Scene.GetComponent<UnitComponent>().Get(message.Id);
MoveComponent moveComponent = unit.GetComponent<MoveComponent>();
......
......@@ -6,7 +6,7 @@ namespace Hotfix
#if ILRuntime
public interface IMHandler
{
void Handle(AMessage message);
void Handle(Session session, AMessage message);
Type GetMessageType();
}
#else
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册