mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-04-21 19:49:34 +08:00
Socket Receive修改为完整传输模式 (#72)
* ReceiveArray修改为完整传输模式 * 完善完整传输模式,删除单对象接收方法
This commit is contained in:
parent
db6b01afa5
commit
af7e19096d
@ -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 [];
|
||||
}
|
||||
|
@ -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">
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user