diff --git a/FunGame.Core/Api/Transmittal/MailSender.cs b/FunGame.Core/Api/Transmittal/MailSender.cs
index 5819dfd..4d8bec2 100644
--- a/FunGame.Core/Api/Transmittal/MailSender.cs
+++ b/FunGame.Core/Api/Transmittal/MailSender.cs
@@ -34,15 +34,24 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
return _LastestResult;
}
- public bool Dispose()
+ private bool IsDisposed = false;
+
+ public void Dispose()
{
- return MailManager.Dispose(this);
+ Dispose(true);
+ GC.SuppressFinalize(this);
}
- void IDisposable.Dispose()
+ protected void Dispose(bool Disposing)
{
- MailManager.Dispose(this);
- GC.SuppressFinalize(this);
+ if (!IsDisposed)
+ {
+ if (Disposing)
+ {
+ MailManager.Dispose(this);
+ }
+ }
+ IsDisposed = true;
}
}
}
diff --git a/FunGame.Core/Interface/Base/IClientSocket.cs b/FunGame.Core/Interface/Base/IClientSocket.cs
new file mode 100644
index 0000000..1125594
--- /dev/null
+++ b/FunGame.Core/Interface/Base/IClientSocket.cs
@@ -0,0 +1,13 @@
+using Milimoe.FunGame.Core.Library.Constant;
+
+namespace Milimoe.FunGame.Core.Interface.Base
+{
+ public interface IClientSocket : ISocket
+ {
+ public bool Receiving { get; }
+ public void StartReceiving(Task t);
+ public SocketResult Send(SocketMessageType type, params object[] objs);
+ public Library.Common.Network.SocketObject Receive();
+ public void BindEvent(Delegate Method, bool Remove = false);
+ }
+}
diff --git a/FunGame.Core/Interface/Base/ISocket.cs b/FunGame.Core/Interface/Base/ISocket.cs
index 40cee43..1ef1d44 100644
--- a/FunGame.Core/Interface/Base/ISocket.cs
+++ b/FunGame.Core/Interface/Base/ISocket.cs
@@ -12,10 +12,6 @@ namespace Milimoe.FunGame.Core.Interface.Base
public string ServerName { get; }
public string ServerNotice { get; }
public bool Connected => Instance != null && Instance.Connected;
- public bool Receiving { get; }
- public SocketResult Send(SocketMessageType type, params object[] objs);
- public Library.Common.Network.SocketObject Receive();
public void Close();
- public void StartReceiving(Task t);
}
}
diff --git a/FunGame.Desktop/Library/Interface/ISocketHandler.cs b/FunGame.Core/Interface/Base/ISocketHandler.cs
similarity index 76%
rename from FunGame.Desktop/Library/Interface/ISocketHandler.cs
rename to FunGame.Core/Interface/Base/ISocketHandler.cs
index 9fbca94..501e314 100644
--- a/FunGame.Desktop/Library/Interface/ISocketHandler.cs
+++ b/FunGame.Core/Interface/Base/ISocketHandler.cs
@@ -1,6 +1,6 @@
using Milimoe.FunGame.Core.Library.Common.Network;
-namespace Milimoe.FunGame.Desktop.Library.Interface
+namespace Milimoe.FunGame.Core.Interface.Base
{
public interface ISocketHandler
{
diff --git a/FunGame.Core/Library/Common/Architecture/BaseController.cs b/FunGame.Core/Library/Common/Architecture/BaseController.cs
new file mode 100644
index 0000000..ee8ebf3
--- /dev/null
+++ b/FunGame.Core/Library/Common/Architecture/BaseController.cs
@@ -0,0 +1,10 @@
+namespace Milimoe.FunGame.Core.Library.Common.Architecture
+{
+ public abstract class BaseController
+ {
+ ///
+ /// 重写此方法并调用Model的Dispose方法,否则将无法正常将监听Socket的事件移除!
+ ///
+ public abstract void Dispose();
+ }
+}
diff --git a/FunGame.Core/Library/Common/Architecture/BaseModel.cs b/FunGame.Core/Library/Common/Architecture/BaseModel.cs
new file mode 100644
index 0000000..be2811f
--- /dev/null
+++ b/FunGame.Core/Library/Common/Architecture/BaseModel.cs
@@ -0,0 +1,67 @@
+using Milimoe.FunGame.Core.Interface.Base;
+using Milimoe.FunGame.Core.Library.Common.Network;
+using Milimoe.FunGame.Core.Service;
+
+namespace Milimoe.FunGame.Core.Library.Common.Architecture
+{
+ public class BaseModel : ISocketHandler, IDisposable
+ {
+ ///
+ /// Socket
+ ///
+ private readonly Socket _Socket;
+
+ ///
+ /// 继承请调用base构造
+ ///
+ /// Socket
+ public BaseModel(Socket? socket)
+ {
+ if (socket != null)
+ {
+ _Socket = socket;
+ socket.BindEvent(new SocketManager.SocketReceiveHandler(SocketHandler));
+ }
+ else throw new SocketCreateReceivingException();
+ }
+
+ ///
+ /// 继承请重写此方法
+ ///
+ /// SocketObject
+ public virtual void SocketHandler(SocketObject SocketObject)
+ {
+
+ }
+
+ ///
+ /// 判断是否已经Disposed
+ ///
+ private bool IsDisposed = false;
+
+ ///
+ /// 公开的Dispose方法
+ ///
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ ///
+ /// 关闭时
+ ///
+ ///
+ protected void Dispose(bool Disposing)
+ {
+ if (!IsDisposed)
+ {
+ if (Disposing)
+ {
+ _Socket.BindEvent(new SocketManager.SocketReceiveHandler(SocketHandler), true);
+ }
+ }
+ IsDisposed = true;
+ }
+ }
+}
diff --git a/FunGame.Core/Library/Common/Network/ClientSocket.cs b/FunGame.Core/Library/Common/Network/ClientSocket.cs
index bce83d7..218b964 100644
--- a/FunGame.Core/Library/Common/Network/ClientSocket.cs
+++ b/FunGame.Core/Library/Common/Network/ClientSocket.cs
@@ -4,7 +4,7 @@ using Milimoe.FunGame.Core.Service;
namespace Milimoe.FunGame.Core.Library.Common.Network
{
- public class ClientSocket : ISocket
+ public class ClientSocket : IClientSocket
{
public System.Net.Sockets.Socket Instance { get; }
public int Runtime { get; } = (int)SocketRuntimeType.Server;
@@ -62,6 +62,18 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
return SocketResult.NotSent;
}
+ public void BindEvent(Delegate Method, bool Remove = false)
+ {
+ if (!Remove)
+ {
+ SocketManager.SocketReceive += (SocketManager.SocketReceiveHandler)Method;
+ }
+ else
+ {
+ SocketManager.SocketReceive -= (SocketManager.SocketReceiveHandler)Method;
+ }
+ }
+
public void StartReceiving(Task t)
{
_Receiving = true;
diff --git a/FunGame.Core/Library/Common/Network/ServerSocket.cs b/FunGame.Core/Library/Common/Network/ServerSocket.cs
index 653a73e..64ec1e0 100644
--- a/FunGame.Core/Library/Common/Network/ServerSocket.cs
+++ b/FunGame.Core/Library/Common/Network/ServerSocket.cs
@@ -15,12 +15,10 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
public string ServerName { get; } = "";
public string ServerNotice { get; } = "";
public bool Connected => Instance != null && Instance.Connected;
- public bool Receiving => _Receiving;
public List GetUsersList => OnlineUsers.GetList();
public int UsersCount => OnlineUsers.Count;
private readonly ThreadManager OnlineUsers;
- private bool _Receiving = false;
private ServerSocket(System.Net.Sockets.Socket Instance, int ServerPort, int MaxConnection = 0)
{
@@ -72,26 +70,11 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
return OnlineUsers[UserName];
}
- public SocketResult Send(SocketMessageType type, params object[] objs)
- {
- throw new ListeningSocketCanNotSendException();
- }
-
- public SocketObject Receive()
- {
- throw new ListeningSocketCanNotSendException();
- }
-
public void Close()
{
Instance?.Close();
}
- public void StartReceiving(Task t)
- {
- throw new ListeningSocketCanNotSendException();
- }
-
public static string GetTypeString(SocketMessageType type)
{
return Socket.GetTypeString(type);
diff --git a/FunGame.Core/Library/Common/Network/Socket.cs b/FunGame.Core/Library/Common/Network/Socket.cs
index a8de6d5..a9b14cc 100644
--- a/FunGame.Core/Library/Common/Network/Socket.cs
+++ b/FunGame.Core/Library/Common/Network/Socket.cs
@@ -4,7 +4,7 @@ using Milimoe.FunGame.Core.Service;
namespace Milimoe.FunGame.Core.Library.Common.Network
{
- public class Socket : ISocket, ISocketHeartBeat
+ public class Socket : IClientSocket, ISocketHeartBeat
{
public System.Net.Sockets.Socket Instance { get; }
public int Runtime { get; } = (int)SocketRuntimeType.Client;
@@ -72,6 +72,18 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
}
}
+ public void BindEvent(Delegate Method, bool Remove = false)
+ {
+ if (!Remove)
+ {
+ SocketManager.SocketReceive += (SocketManager.SocketReceiveHandler)Method;
+ }
+ else
+ {
+ SocketManager.SocketReceive -= (SocketManager.SocketReceiveHandler)Method;
+ }
+ }
+
public void CheckHeartBeatFaileds()
{
if (HeartBeatFaileds >= 3) Close();
diff --git a/FunGame.Core/Library/Common/Network/SocketObject.cs b/FunGame.Core/Library/Common/Network/SocketObject.cs
index 257fb14..35d1b00 100644
--- a/FunGame.Core/Library/Common/Network/SocketObject.cs
+++ b/FunGame.Core/Library/Common/Network/SocketObject.cs
@@ -1,4 +1,5 @@
-using Milimoe.FunGame.Core.Library.Constant;
+using Milimoe.FunGame.Core.Api.Utility;
+using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Core.Library.Common.Network
{
@@ -7,12 +8,30 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
public SocketMessageType SocketType { get; } = SocketMessageType.Unknown;
public Guid Token { get; } = Guid.Empty;
public object[] Parameters { get; } = Array.Empty