From af7e19096d7e70279599b977462a11c96fe6a7e3 Mon Sep 17 00:00:00 2001 From: milimoe <110188673+milimoe@users.noreply.github.com> Date: Mon, 1 Jan 2024 03:22:06 +0800 Subject: [PATCH] =?UTF-8?q?Socket=20Receive=E4=BF=AE=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E4=BC=A0=E8=BE=93=E6=A8=A1=E5=BC=8F=20(#72)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ReceiveArray修改为完整传输模式 * 完善完整传输模式,删除单对象接收方法 --- Controller/RunTimeController.cs | 4 +- Docs/FunGame.Core.xml | 24 +---- Interface/Base/IClientSocket.cs | 3 +- Library/Common/Network/ClientSocket.cs | 14 +-- Library/Common/Network/Socket.cs | 23 +---- Service/SocketManager.cs | 136 +++++++++---------------- 6 files changed, 57 insertions(+), 147 deletions(-) diff --git a/Controller/RunTimeController.cs b/Controller/RunTimeController.cs index baf9449..4a65186 100644 --- a/Controller/RunTimeController.cs +++ b/Controller/RunTimeController.cs @@ -111,7 +111,7 @@ namespace Milimoe.FunGame.Core.Controller { if (_Socket.Send(SocketMessageType.Connect, ConnectArgs.Cast().ToArray()) == SocketResult.Success) { - SocketObject[] objs = _Socket.ReceiveArray(); + SocketObject[] objs = _Socket.Receive(); foreach (SocketObject obj in objs) { if (obj.SocketType == SocketMessageType.Connect) @@ -311,7 +311,7 @@ namespace Milimoe.FunGame.Core.Controller { if (_Socket != null && _Socket.Connected) { - return _Socket.ReceiveArray(); + return _Socket.Receive(); } return []; } diff --git a/Docs/FunGame.Core.xml b/Docs/FunGame.Core.xml index 9dd96c0..0533bb1 100644 --- a/Docs/FunGame.Core.xml +++ b/Docs/FunGame.Core.xml @@ -2666,30 +2666,12 @@ Socket信息容器 通信结果 - - - 用于客户端接收服务器信息 - - SocketObject - - 用于服务器接收客户端信息 + 接收数据流中的信息 + 如果是服务器接收信息需要传入客户端Socket - 客户端Socket - SocketObject - - - - 用于客户端接收服务器信息(数组版) - - SocketObjects - - - - 用于服务器接收客户端信息(数组版) - - 客户端Socket + 如果是服务器接收信息需要传入客户端Socket SocketObjects diff --git a/Interface/Base/IClientSocket.cs b/Interface/Base/IClientSocket.cs index af748ea..55fe5fc 100644 --- a/Interface/Base/IClientSocket.cs +++ b/Interface/Base/IClientSocket.cs @@ -7,8 +7,7 @@ namespace Milimoe.FunGame.Core.Interface.Base public bool Receiving { get; } public void StartReceiving(Task t); public SocketResult Send(SocketMessageType type, params object[] objs); - public Library.Common.Network.SocketObject Receive(); - public Library.Common.Network.SocketObject[] ReceiveArray(); + public Library.Common.Network.SocketObject[] Receive(); public void BindEvent(Delegate Method, bool Remove = false); } } diff --git a/Library/Common/Network/ClientSocket.cs b/Library/Common/Network/ClientSocket.cs index ffa710e..40d7ccb 100644 --- a/Library/Common/Network/ClientSocket.cs +++ b/Library/Common/Network/ClientSocket.cs @@ -38,7 +38,7 @@ namespace Milimoe.FunGame.Core.Library.Common.Network Instance?.Close(); } - public SocketObject Receive() + public SocketObject[] Receive() { try { @@ -50,18 +50,6 @@ namespace Milimoe.FunGame.Core.Library.Common.Network } } - public SocketObject[] ReceiveArray() - { - try - { - return SocketManager.ReceiveArray(Instance); - } - catch - { - throw new SocketWrongInfoException(); - } - } - public SocketResult Send(SocketMessageType type, params object[] objs) { if (Instance != null) diff --git a/Library/Common/Network/Socket.cs b/Library/Common/Network/Socket.cs index 0978fa8..89cdbc6 100644 --- a/Library/Common/Network/Socket.cs +++ b/Library/Common/Network/Socket.cs @@ -55,30 +55,11 @@ namespace Milimoe.FunGame.Core.Library.Common.Network return SocketResult.NotSent; } - public SocketObject Receive() + public SocketObject[] Receive() { try { - SocketObject result = SocketManager.Receive(); - if (result.SocketType == SocketMessageType.HeartBeat) - { - if (WaitHeartBeatReply != null && !WaitHeartBeatReply.IsCompleted) WaitHeartBeatReply.Wait(1); - _HeartBeatFaileds = 0; - } - return result; - } - catch (System.Exception e) - { - Api.Utility.TXTHelper.AppendErrorLog(e.GetErrorInfo()); - throw new SocketWrongInfoException(); - } - } - - public SocketObject[] ReceiveArray() - { - try - { - SocketObject[] result = SocketManager.ReceiveArray(); + SocketObject[] result = SocketManager.Receive(); foreach (SocketObject obj in result) { if (obj.SocketType == SocketMessageType.HeartBeat) diff --git a/Service/SocketManager.cs b/Service/SocketManager.cs index ba79357..e4975cf 100644 --- a/Service/SocketManager.cs +++ b/Service/SocketManager.cs @@ -56,7 +56,7 @@ namespace Milimoe.FunGame.Core.Service /// 客户端IP地址[0]和客户端Socket[1] internal static object[] Accept() { - if (ServerSocket is null) return Array.Empty(); + if (ServerSocket is null) return []; Socket Client; string ClientIP; try @@ -65,13 +65,13 @@ namespace Milimoe.FunGame.Core.Service Client.NoDelay = true; IPEndPoint? ClientIPEndPoint = (IPEndPoint?)Client.RemoteEndPoint; ClientIP = (ClientIPEndPoint != null) ? ClientIPEndPoint.ToString() : "Unknown"; - return new object[] { ClientIP, Client }; + return [ClientIP, Client]; } catch { ServerSocket?.Close(); } - return Array.Empty(); + return []; } /// @@ -150,101 +150,61 @@ namespace Milimoe.FunGame.Core.Service } /// - /// 用于客户端接收服务器信息 + /// 接收数据流中的信息 + /// 如果是服务器接收信息需要传入客户端Socket /// - /// SocketObject - internal static Library.Common.Network.SocketObject Receive() + /// 如果是服务器接收信息需要传入客户端Socket + /// SocketObjects + internal static Library.Common.Network.SocketObject[] Receive(Socket? ClientSocket = null) { - Library.Common.Network.SocketObject result = default; - if (Socket != null) + List result = []; + Socket? tempSocket = ClientSocket is null ? Socket : ClientSocket; + if (tempSocket != null) { // 从服务器接收消息 byte[] buffer = new byte[General.SocketByteSize]; - int length = Socket.Receive(buffer); + int length = tempSocket.Receive(buffer, buffer.Length, SocketFlags.None); + string msg = ""; if (length > 0) { - string msg = General.DefaultEncoding.GetString(buffer, 0, length); - result = JsonManager.GetObject(msg); + msg = General.DefaultEncoding.GetString(buffer, 0, length); + if (JsonManager.IsCompleteJson(msg)) + { + foreach (Library.Common.Network.SocketObject obj in JsonManager.GetObjects(msg)) + { + result.Add(obj); + // 客户端接收消息,广播ScoketObject到每个UIModel + if (ClientSocket is null) OnSocketReceive(obj); + } + return [.. result]; + } + else + { + Thread.Sleep(20); + while (true) + { + if (tempSocket.Available > 0) + { + length = tempSocket.Receive(buffer, buffer.Length, SocketFlags.None); + msg += General.DefaultEncoding.GetString(buffer, 0, length); + if (JsonManager.IsCompleteJson(msg)) + { + break; + } + Thread.Sleep(20); + } + else break; + } + } + } + foreach (Library.Common.Network.SocketObject obj in JsonManager.GetObjects(msg)) + { + result.Add(obj); // 客户端接收消息,广播ScoketObject到每个UIModel - OnSocketReceive(result); - return result; + if (ClientSocket is null) OnSocketReceive(obj); } } - return result; - } - - /// - /// 用于服务器接收客户端信息 - /// - /// 客户端Socket - /// SocketObject - internal static Library.Common.Network.SocketObject Receive(Socket ClientSocket) - { - Library.Common.Network.SocketObject result = default; - if (ClientSocket != null) - { - // 从客户端接收消息 - byte[] buffer = new byte[General.SocketByteSize]; - int length = ClientSocket.Receive(buffer); - if (length > 0) - { - string msg = General.DefaultEncoding.GetString(buffer, 0, length); - result = JsonManager.GetObject(msg); - return result; - } - } - return result; - } - - /// - /// 用于客户端接收服务器信息(数组版) - /// - /// SocketObjects - internal static Library.Common.Network.SocketObject[] ReceiveArray() - { - List result = new(); - if (Socket != null) - { - // 从服务器接收消息 - byte[] buffer = new byte[General.SocketByteSize]; - int length = Socket.Receive(buffer); - if (length > 0) - { - string msg = General.DefaultEncoding.GetString(buffer, 0, length); - foreach (Library.Common.Network.SocketObject obj in JsonManager.GetObjects(msg)) - { - // 客户端接收消息,广播ScoketObject到每个UIModel - result.Add(obj); - OnSocketReceive(obj); - } - } - } - return result.ToArray(); - } - - /// - /// 用于服务器接收客户端信息(数组版) - /// - /// 客户端Socket - /// SocketObjects - internal static Library.Common.Network.SocketObject[] ReceiveArray(Socket ClientSocket) - { - List result = new(); - if (ClientSocket != null) - { - // 从客户端接收消息 - byte[] buffer = new byte[General.SocketByteSize]; - int length = ClientSocket.Receive(buffer); - if (length > 0) - { - string msg = General.DefaultEncoding.GetString(buffer, 0, length); - foreach (Library.Common.Network.SocketObject obj in JsonManager.GetObjects(msg)) - { - result.Add(obj); - } - } - } - return result.ToArray(); + return [.. result]; } #endregion