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) if (_Socket.Send(SocketMessageType.Connect, ConnectArgs.Cast<object>().ToArray()) == SocketResult.Success)
{ {
SocketObject[] objs = _Socket.ReceiveArray(); SocketObject[] objs = _Socket.Receive();
foreach (SocketObject obj in objs) foreach (SocketObject obj in objs)
{ {
if (obj.SocketType == SocketMessageType.Connect) if (obj.SocketType == SocketMessageType.Connect)
@ -311,7 +311,7 @@ namespace Milimoe.FunGame.Core.Controller
{ {
if (_Socket != null && _Socket.Connected) if (_Socket != null && _Socket.Connected)
{ {
return _Socket.ReceiveArray(); return _Socket.Receive();
} }
return []; return [];
} }

View File

@ -2666,30 +2666,12 @@
<param name="SocketObject">Socket信息容器</param> <param name="SocketObject">Socket信息容器</param>
<returns>通信结果</returns> <returns>通信结果</returns>
</member> </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)"> <member name="M:Milimoe.FunGame.Core.Service.SocketManager.Receive(System.Net.Sockets.Socket)">
<summary> <summary>
用于服务器接收客户端信息 接收数据流中的信息
<para/>如果是服务器接收信息需要传入客户端Socket <paramref name="ClientSocket"/>
</summary> </summary>
<param name="ClientSocket">客户端Socket</param> <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>
<returns>SocketObjects</returns> <returns>SocketObjects</returns>
</member> </member>
<member name="T:Milimoe.FunGame.Core.Service.SocketManager.SocketReceiveHandler"> <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 bool Receiving { get; }
public void StartReceiving(Task t); public void StartReceiving(Task t);
public SocketResult Send(SocketMessageType type, params object[] objs); public SocketResult Send(SocketMessageType type, params object[] objs);
public Library.Common.Network.SocketObject Receive(); public Library.Common.Network.SocketObject[] Receive();
public Library.Common.Network.SocketObject[] ReceiveArray();
public void BindEvent(Delegate Method, bool Remove = false); public void BindEvent(Delegate Method, bool Remove = false);
} }
} }

View File

@ -38,7 +38,7 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
Instance?.Close(); Instance?.Close();
} }
public SocketObject Receive() public SocketObject[] Receive()
{ {
try 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) public SocketResult Send(SocketMessageType type, params object[] objs)
{ {
if (Instance != null) if (Instance != null)

View File

@ -55,30 +55,11 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
return SocketResult.NotSent; return SocketResult.NotSent;
} }
public SocketObject Receive() public SocketObject[] Receive()
{ {
try try
{ {
SocketObject result = SocketManager.Receive(); 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();
foreach (SocketObject obj in result) foreach (SocketObject obj in result)
{ {
if (obj.SocketType == SocketMessageType.HeartBeat) if (obj.SocketType == SocketMessageType.HeartBeat)

View File

@ -56,7 +56,7 @@ namespace Milimoe.FunGame.Core.Service
/// <returns>客户端IP地址[0]和客户端Socket[1]</returns> /// <returns>客户端IP地址[0]和客户端Socket[1]</returns>
internal static object[] Accept() internal static object[] Accept()
{ {
if (ServerSocket is null) return Array.Empty<object>(); if (ServerSocket is null) return [];
Socket Client; Socket Client;
string ClientIP; string ClientIP;
try try
@ -65,13 +65,13 @@ namespace Milimoe.FunGame.Core.Service
Client.NoDelay = true; Client.NoDelay = true;
IPEndPoint? ClientIPEndPoint = (IPEndPoint?)Client.RemoteEndPoint; IPEndPoint? ClientIPEndPoint = (IPEndPoint?)Client.RemoteEndPoint;
ClientIP = (ClientIPEndPoint != null) ? ClientIPEndPoint.ToString() : "Unknown"; ClientIP = (ClientIPEndPoint != null) ? ClientIPEndPoint.ToString() : "Unknown";
return new object[] { ClientIP, Client }; return [ClientIP, Client];
} }
catch catch
{ {
ServerSocket?.Close(); ServerSocket?.Close();
} }
return Array.Empty<object>(); return [];
} }
/// <summary> /// <summary>
@ -150,101 +150,61 @@ namespace Milimoe.FunGame.Core.Service
} }
/// <summary> /// <summary>
/// 用于客户端接收服务器信息 /// 接收数据流中的信息
/// <para/>如果是服务器接收信息需要传入客户端Socket <paramref name="ClientSocket"/>
/// </summary> /// </summary>
/// <returns>SocketObject</returns> /// <param name="ClientSocket">如果是服务器接收信息需要传入客户端Socket</param>
internal static Library.Common.Network.SocketObject Receive() /// <returns>SocketObjects</returns>
internal static Library.Common.Network.SocketObject[] Receive(Socket? ClientSocket = null)
{ {
Library.Common.Network.SocketObject result = default; List<Library.Common.Network.SocketObject> result = [];
if (Socket != null) Socket? tempSocket = ClientSocket is null ? Socket : ClientSocket;
if (tempSocket != null)
{ {
// 从服务器接收消息 // 从服务器接收消息
byte[] buffer = new byte[General.SocketByteSize]; 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) if (length > 0)
{ {
string msg = General.DefaultEncoding.GetString(buffer, 0, length); msg = General.DefaultEncoding.GetString(buffer, 0, length);
result = JsonManager.GetObject<Library.Common.Network.SocketObject>(msg); 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 // 客户端接收消息广播ScoketObject到每个UIModel
OnSocketReceive(result); if (ClientSocket is null) OnSocketReceive(obj);
return result;
} }
} }
return result; 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();
} }
#endregion #endregion