mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-04-21 11:39:35 +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)
|
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 [];
|
||||||
}
|
}
|
||||||
|
@ -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">
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user