Socket Receive修改为完整传输模式 (#72)

* ReceiveArray修改为完整传输模式

* 完善完整传输模式,删除单对象接收方法
This commit is contained in:
milimoe 2024-01-01 03:22:06 +08:00 committed by GitHub
parent db6b01afa5
commit af7e19096d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 57 additions and 147 deletions

View File

@ -111,7 +111,7 @@ namespace Milimoe.FunGame.Core.Controller
{
if (_Socket.Send(SocketMessageType.Connect, ConnectArgs.Cast<object>().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 [];
}

View File

@ -2666,30 +2666,12 @@
<param name="SocketObject">Socket信息容器</param>
<returns>通信结果</returns>
</member>
<member name="M:Milimoe.FunGame.Core.Service.SocketManager.Receive">
<summary>
用于客户端接收服务器信息
</summary>
<returns>SocketObject</returns>
</member>
<member name="M:Milimoe.FunGame.Core.Service.SocketManager.Receive(System.Net.Sockets.Socket)">
<summary>
用于服务器接收客户端信息
接收数据流中的信息
<para/>如果是服务器接收信息需要传入客户端Socket <paramref name="ClientSocket"/>
</summary>
<param name="ClientSocket">客户端Socket</param>
<returns>SocketObject</returns>
</member>
<member name="M:Milimoe.FunGame.Core.Service.SocketManager.ReceiveArray">
<summary>
用于客户端接收服务器信息(数组版)
</summary>
<returns>SocketObjects</returns>
</member>
<member name="M:Milimoe.FunGame.Core.Service.SocketManager.ReceiveArray(System.Net.Sockets.Socket)">
<summary>
用于服务器接收客户端信息(数组版)
</summary>
<param name="ClientSocket">客户端Socket</param>
<param name="ClientSocket">如果是服务器接收信息需要传入客户端Socket</param>
<returns>SocketObjects</returns>
</member>
<member name="T:Milimoe.FunGame.Core.Service.SocketManager.SocketReceiveHandler">

View File

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

View File

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

View File

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

View File

@ -56,7 +56,7 @@ namespace Milimoe.FunGame.Core.Service
/// <returns>客户端IP地址[0]和客户端Socket[1]</returns>
internal static object[] Accept()
{
if (ServerSocket is null) return Array.Empty<object>();
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<object>();
return [];
}
/// <summary>
@ -150,101 +150,61 @@ namespace Milimoe.FunGame.Core.Service
}
/// <summary>
/// 用于客户端接收服务器信息
/// 接收数据流中的信息
/// <para/>如果是服务器接收信息需要传入客户端Socket <paramref name="ClientSocket"/>
/// </summary>
/// <returns>SocketObject</returns>
internal static Library.Common.Network.SocketObject Receive()
/// <param name="ClientSocket">如果是服务器接收信息需要传入客户端Socket</param>
/// <returns>SocketObjects</returns>
internal static Library.Common.Network.SocketObject[] Receive(Socket? ClientSocket = null)
{
Library.Common.Network.SocketObject result = default;
if (Socket != null)
List<Library.Common.Network.SocketObject> 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<Library.Common.Network.SocketObject>(msg);
msg = General.DefaultEncoding.GetString(buffer, 0, length);
if (JsonManager.IsCompleteJson<Library.Common.Network.SocketObject>(msg))
{
foreach (Library.Common.Network.SocketObject obj in JsonManager.GetObjects<Library.Common.Network.SocketObject>(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<Library.Common.Network.SocketObject>(msg))
{
break;
}
Thread.Sleep(20);
}
else break;
}
}
}
foreach (Library.Common.Network.SocketObject obj in JsonManager.GetObjects<Library.Common.Network.SocketObject>(msg))
{
result.Add(obj);
// 客户端接收消息广播ScoketObject到每个UIModel
OnSocketReceive(result);
return result;
if (ClientSocket is null) OnSocketReceive(obj);
}
}
return result;
}
/// <summary>
/// 用于服务器接收客户端信息
/// </summary>
/// <param name="ClientSocket">客户端Socket</param>
/// <returns>SocketObject</returns>
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<Library.Common.Network.SocketObject>(msg);
return result;
}
}
return result;
}
/// <summary>
/// 用于客户端接收服务器信息(数组版)
/// </summary>
/// <returns>SocketObjects</returns>
internal static Library.Common.Network.SocketObject[] ReceiveArray()
{
List<Library.Common.Network.SocketObject> 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<Library.Common.Network.SocketObject>(msg))
{
// 客户端接收消息广播ScoketObject到每个UIModel
result.Add(obj);
OnSocketReceive(obj);
}
}
}
return result.ToArray();
}
/// <summary>
/// 用于服务器接收客户端信息(数组版)
/// </summary>
/// <param name="ClientSocket">客户端Socket</param>
/// <returns>SocketObjects</returns>
internal static Library.Common.Network.SocketObject[] ReceiveArray(Socket ClientSocket)
{
List<Library.Common.Network.SocketObject> 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<Library.Common.Network.SocketObject>(msg))
{
result.Add(obj);
}
}
}
return result.ToArray();
return [.. result];
}
#endregion