فهرست منبع

Session的Error改成int类型,方便自己增加错误码,并且在Session中增加Error字段,方便
打印错误码,ActorMessageSender也增加了Error字段

tanghai 7 سال پیش
والد
کامیت
ad822d06db

+ 2 - 1
Server/Hotfix/Module/Actor/ActorMessageSenderComponentSystem.cs

@@ -35,7 +35,8 @@ namespace ETHotfix
                     {
                         continue;
                     }
-					
+
+                    actorMessageSender.Error = ErrorCode.ERR_ActorTimeOut;
                     timeoutActorProxyIds.Add(id);
                 }
 

+ 47 - 38
Server/Hotfix/Module/Actor/ActorMessageSenderSystem.cs

@@ -12,10 +12,11 @@ namespace ETHotfix
 		public override void Awake(ActorMessageSender self)
 		{
 			self.LastSendTime = TimeHelper.Now();
-			self.tcs = null;
+			self.Tcs = null;
 			self.FailTimes = 0;
 			self.MaxFailTimes = 5;
 			self.ActorId = 0;
+			self.Error = 0;
 		}
 	}
 	
@@ -25,10 +26,11 @@ namespace ETHotfix
 		public override void Awake(ActorMessageSender self, long actorId)
 		{
 			self.LastSendTime = TimeHelper.Now();
-			self.tcs = null;
+			self.Tcs = null;
 			self.FailTimes = 0;
 			self.MaxFailTimes = 0;
 			self.ActorId = actorId;
+			self.Error = 0;
 		}
 	}
 
@@ -55,19 +57,18 @@ namespace ETHotfix
 	{
 		public override void Destroy(ActorMessageSender self)
 		{
-			self.LastSendTime = 0;
-			self.Address = null;
-
 			while (self.WaitingTasks.Count > 0)
 			{
 				ActorTask actorTask = self.WaitingTasks.Dequeue();
-				actorTask.RunFail(ErrorCode.ERR_NotFoundActor);
+				actorTask.RunFail(self.Error);
 			}
-
+			
+			self.LastSendTime = 0;
+			self.Address = null;
 			self.ActorId = 0;
 			self.FailTimes = 0;
-			var t = self.tcs;
-			self.tcs = null;
+			var t = self.Tcs;
+			self.Tcs = null;
 			t?.SetResult(new ActorTask());
 		}
 	}
@@ -91,15 +92,15 @@ namespace ETHotfix
 
 		private static void AllowGet(this ActorMessageSender self)
 		{
-			if (self.tcs == null || self.WaitingTasks.Count <= 0)
+			if (self.Tcs == null || self.WaitingTasks.Count <= 0)
 			{
 				return;
 			}
 
 			ActorTask task = self.WaitingTasks.Peek();
 
-			var t = self.tcs;
-			self.tcs = null;
+			var t = self.Tcs;
+			self.Tcs = null;
 			t.SetResult(task);
 		}
 
@@ -111,8 +112,8 @@ namespace ETHotfix
 				return Task.FromResult(task);
 			}
 
-			self.tcs = new TaskCompletionSource<ActorTask>();
-			return self.tcs.Task;
+			self.Tcs = new TaskCompletionSource<ActorTask>();
+			return self.Tcs.Task;
 		}
 
 		public static async void UpdateAsync(this ActorMessageSender self)
@@ -140,35 +141,43 @@ namespace ETHotfix
 		{
 			IResponse response = await task.Run();
 
-			// 如果没找到Actor,重试
-			if (response.Error == ErrorCode.ERR_NotFoundActor)
+			// 发送成功
+			switch (response.Error)
 			{
-				++self.FailTimes;
+				case ErrorCode.ERR_Success:
+					self.LastSendTime = TimeHelper.Now();
+					self.FailTimes = 0;
 
-				// 失败MaxFailTimes次则清空actor发送队列,返回失败
-				if (self.FailTimes > self.MaxFailTimes)
-				{
-					// 失败直接删除actorproxy
-					Log.Info($"actor send message fail, actorid: {self.Id}");
-					self.GetParent<ActorMessageSenderComponent>().Remove(self.Id);
+					self.WaitingTasks.Dequeue();
 					return;
-				}
+				case ErrorCode.ERR_NotFoundActor:
+					// 如果没找到Actor,重试
+					++self.FailTimes;
 
-				// 等待1s再发送
-				await Game.Scene.GetComponent<TimerComponent>().WaitAsync(1000);
-				self.ActorId = await Game.Scene.GetComponent<LocationProxyComponent>().Get(self.Id);
-				self.Address = Game.Scene.GetComponent<StartConfigComponent>()
-						.Get(IdGenerater.GetAppIdFromId(self.ActorId))
-						.GetComponent<InnerConfig>().IPEndPoint;
-				self.AllowGet();
-				return;
-			}
-
-			// 发送成功
-			self.LastSendTime = TimeHelper.Now();
-			self.FailTimes = 0;
+					// 失败MaxFailTimes次则清空actor发送队列,返回失败
+					if (self.FailTimes > self.MaxFailTimes)
+					{
+						// 失败直接删除actorproxy
+						Log.Info($"actor send message fail, actorid: {self.Id}");
+						self.Error = response.Error;
+						self.GetParent<ActorMessageSenderComponent>().Remove(self.Id);
+						return;
+					}
 
-			self.WaitingTasks.Dequeue();
+					// 等待1s再发送
+					await Game.Scene.GetComponent<TimerComponent>().WaitAsync(1000);
+					self.ActorId = await Game.Scene.GetComponent<LocationProxyComponent>().Get(self.Id);
+					self.Address = Game.Scene.GetComponent<StartConfigComponent>()
+							.Get(IdGenerater.GetAppIdFromId(self.ActorId))
+							.GetComponent<InnerConfig>().IPEndPoint;
+					self.AllowGet();
+					return;
+				default:
+					// 其它错误
+					self.Error = response.Error;
+					self.GetParent<ActorMessageSenderComponent>().Remove(self.Id);
+					return;
+			}
 		}
 
 		public static void Send(this ActorMessageSender self, IActorMessage message)

+ 1 - 1
Server/Hotfix/Module/Message/InnerMessageDispatcher.cs

@@ -32,7 +32,7 @@ namespace ETHotfix
 				{
 					ActorResponse response = new ActorResponse
 					{
-						Error = ErrorCode.ERR_NotFoundActor,
+						Error = ErrorCode.ERR_ActorNoActorComponent,
 						RpcId = iActorMessage.RpcId
 					};
 					session.Reply(response);

+ 16 - 2
Server/Model/Module/Actor/ActorMessageSender.cs

@@ -5,7 +5,7 @@ using System.Threading.Tasks;
 
 namespace ETModel
 {
-	public sealed class ActorMessageSender : ComponentWithId
+	public sealed class ActorMessageSender : Entity
 	{
 		// actor的地址
 		public IPEndPoint Address;
@@ -18,10 +18,24 @@ namespace ETModel
 		// 最近发送消息的时间
 		public long LastSendTime;
 
-		public TaskCompletionSource<ActorTask> tcs;
+		public TaskCompletionSource<ActorTask> Tcs;
 
 		public int FailTimes;
 
 		public int MaxFailTimes;
+
+		public int Error;
+
+		public override void Dispose()
+		{
+			if (this.IsDisposed)
+			{
+				return;
+			}
+			
+			base.Dispose();
+
+			this.Error = 0;
+		}
 	}
 }

+ 1 - 0
Unity/Assets/Scripts/Module/Message/ErrorCode.cs

@@ -5,6 +5,7 @@ namespace ETModel
 		public const int ERR_Success = 0;
 		public const int ERR_NotFoundActor = 2;
 		public const int ERR_ActorNoActorComponent = 3;
+		public const int ERR_ActorTimeOut = 4;
 
 		public const int ERR_AccountOrPasswordError = 102;
 		public const int ERR_SessionActorError = 103;

+ 4 - 4
Unity/Assets/Scripts/Module/Message/Network/AChannel.cs

@@ -29,9 +29,9 @@ namespace ETModel
 
 		public IPEndPoint RemoteAddress { get; protected set; }
 
-		private Action<AChannel, SocketError> errorCallback;
+		private Action<AChannel, int> errorCallback;
 
-		public event Action<AChannel, SocketError> ErrorCallback
+		public event Action<AChannel, int> ErrorCallback
 		{
 			add
 			{
@@ -43,13 +43,13 @@ namespace ETModel
 			}
 		}
 
-		protected void OnError(SocketError e)
+		protected void OnError(int error)
 		{
 			if (this.IsDisposed)
 			{
 				return;
 			}
-			this.errorCallback?.Invoke(this, e);
+			this.errorCallback?.Invoke(this, error);
 		}
 
 

+ 2 - 2
Unity/Assets/Scripts/Module/Message/Network/KCP/KChannel.cs

@@ -153,7 +153,7 @@ namespace ETModel
 			// 超时断开连接
 			if (timeNow - this.lastRecvTime > 20 * 1000)
 			{
-				this.OnError(SocketError.Disconnecting);
+				this.OnError((int)SocketError.Disconnecting);
 				return;
 			}
 			this.kcp.Update(timeNow);
@@ -185,7 +185,7 @@ namespace ETModel
 				int n = kcp.PeekSize();
 				if (n == 0)
 				{
-					this.OnError(SocketError.NetworkReset);
+					this.OnError((int)SocketError.NetworkReset);
 					return;
 				}
 				int count = this.kcp.Recv(this.cacheBytes);

+ 9 - 9
Unity/Assets/Scripts/Module/Message/Network/TCP/TChannel.cs

@@ -58,11 +58,11 @@ namespace ETModel
 			catch (SocketException e)
 			{
 				Log.Error($"connect error: {e.SocketErrorCode}");
-				this.OnError(e.SocketErrorCode);
+				this.OnError((int)e.SocketErrorCode);
 			}
 			catch (Exception e)
 			{
-				this.OnError(SocketError.SocketError);
+				this.OnError((int)SocketError.SocketError);
 				Log.Error($"connect error: {ipEndPoint} {e}");
 			}
 		}
@@ -163,16 +163,16 @@ namespace ETModel
 			}
 			catch (IOException)
 			{
-				this.OnError(SocketError.SocketError);
+				this.OnError((int)SocketError.SocketError);
 			}
 			catch (ObjectDisposedException)
 			{
-				this.OnError(SocketError.SocketError);
+				this.OnError((int)SocketError.SocketError);
 			}
 			catch (Exception e)
 			{
 				Log.Error(e);
-				this.OnError(SocketError.SocketError);
+				this.OnError((int)SocketError.SocketError);
 			}
 		}
 
@@ -197,7 +197,7 @@ namespace ETModel
 
 					if (n == 0)
 					{
-						this.OnError(SocketError.NetworkReset);
+						this.OnError((int)SocketError.NetworkReset);
 						return;
 					}
 					
@@ -217,16 +217,16 @@ namespace ETModel
 			}
 			catch (IOException)
 			{
-				this.OnError(SocketError.SocketError);
+				this.OnError((int)SocketError.SocketError);
 			}
 			catch (ObjectDisposedException)
 			{
-				this.OnError(SocketError.SocketError);
+				this.OnError((int)SocketError.SocketError);
 			}
 			catch (Exception e)
 			{
 				Log.Error(e);
-				this.OnError(SocketError.SocketError);
+				this.OnError((int)SocketError.SocketError);
 			}
 		}
 

+ 10 - 2
Unity/Assets/Scripts/Module/Message/NetworkComponent.cs

@@ -75,7 +75,11 @@ namespace ETModel
 			AChannel channel = await this.Service.AcceptChannel();
 			Session session = ComponentFactory.CreateWithId<Session, NetworkComponent, AChannel>(IdGenerater.GenerateId(), this, channel);
 			session.Parent = this;
-			channel.ErrorCallback += (c, e) => { this.Remove(session.Id); };
+			channel.ErrorCallback += (c, e) =>
+			{
+				session.Error = e;
+				this.Remove(session.Id);
+			};
 			this.sessions.Add(session.Id, session);
 			return session;
 		}
@@ -108,7 +112,11 @@ namespace ETModel
 				AChannel channel = this.Service.ConnectChannel(ipEndPoint);
 				Session session = ComponentFactory.CreateWithId<Session, NetworkComponent, AChannel>(IdGenerater.GenerateId(), this, channel);
 				session.Parent = this;
-				channel.ErrorCallback += (c, e) => { this.Remove(session.Id); };
+				channel.ErrorCallback += (c, e) =>
+				{
+					session.Error = e;
+					this.Remove(session.Id);
+				};
 				this.sessions.Add(session.Id, session);
 				return session;
 			}

+ 5 - 1
Unity/Assets/Scripts/Module/Message/Session.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Net;
+using System.Net.Sockets;
 using System.Threading;
 using System.Threading.Tasks;
 
@@ -29,6 +30,7 @@ namespace ETModel
 	{
 		private static int RpcId { get; set; }
 		private AChannel channel;
+		public int Error;
 
 		private readonly Dictionary<int, Action<IResponse>> requestCallback = new Dictionary<int, Action<IResponse>>();
 		private readonly List<byte[]> byteses = new List<byte[]>() { new byte[1], new byte[0], new byte[0]};
@@ -43,6 +45,7 @@ namespace ETModel
 
 		public void Awake(NetworkComponent net, AChannel c)
 		{
+			this.Error = 0;
 			this.channel = c;
 			this.requestCallback.Clear();
 		}
@@ -65,9 +68,10 @@ namespace ETModel
 
 			foreach (Action<IResponse> action in this.requestCallback.Values.ToArray())
 			{
-				action.Invoke(new ResponseMessage { Error = ErrorCode.ERR_SocketDisconnected });
+				action.Invoke(new ResponseMessage { Error = this.Error });
 			}
 
+			this.Error = 0;
 			this.channel.Dispose();
 			this.Network.Remove(id);
 			this.requestCallback.Clear();