Sfoglia il codice sorgente

客户端消息Handler还是需要带上Session,Session中可以保存消息上下文。
比如,做机器人,需要判断这个消息属于哪个机器人,这些信息可以保存在Session里面

tanghai 8 anni fa
parent
commit
df588fd985

+ 9 - 3
Unity/Assets/Scripts/Base/Message/AMHandler.cs

@@ -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()

+ 4 - 0
Unity/Assets/Scripts/Base/Message/AMessage.cs

@@ -8,6 +8,10 @@ namespace Model
 	[BsonKnownTypes(typeof(AActorMessage))]
 	public abstract class AMessage
 	{
+		public override string ToString()
+		{
+			return MongoHelper.ToJson(this);
+		}
 	}
 
 	[ProtoContract]

+ 2 - 2
Unity/Assets/Scripts/Base/Message/ClientDispatcher.cs

@@ -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;
 			}
 

+ 1 - 1
Unity/Assets/Scripts/Base/Message/IMHandler.cs

@@ -4,7 +4,7 @@ namespace Model
 {
 	public interface IMHandler
 	{
-		void Handle(AMessage message);
+		void Handle(Session session, AMessage message);
 		Type GetMessageType();
 	}
 }

+ 14 - 8
Unity/Assets/Scripts/Component/ClientFrameComponent.cs

@@ -1,5 +1,11 @@
 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 });
             }
         }
     }

+ 6 - 6
Unity/Assets/Scripts/Component/MessageDispatherComponent.cs

@@ -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)
 				{

+ 1 - 1
Unity/Assets/Scripts/Handler/Actor_CreateUnitsHandler.cs

@@ -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>();
 			

+ 1 - 1
Unity/Assets/Scripts/Handler/Actor_TestHandler.cs

@@ -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);
 		}

+ 1 - 1
Unity/Assets/Scripts/Handler/Frame_ClickMapHandler.cs

@@ -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>();

+ 1 - 1
Unity/Hotfix/Base/Message/IMHandler.cs

@@ -6,7 +6,7 @@ namespace Hotfix
 #if ILRuntime
 	public interface IMHandler
 	{
-		void Handle(AMessage message);
+		void Handle(Session session, AMessage message);
 		Type GetMessageType();
 	}
 #else