This commit is contained in:
rawer470 2024-08-18 23:53:21 +03:00
parent 749f1d2bc3
commit d5494b3f97
3 changed files with 74 additions and 11 deletions

View file

@ -77,6 +77,8 @@ namespace ZoFo.GameCore
public void JoinRoom(string ip, int port) public void JoinRoom(string ip, int port)
{ {
EndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), port);
networkManager.EndPointServer = endPoint;
networkManager.JoinRoom(ip, port); networkManager.JoinRoom(ip, port);
} }
public void JoinYourself(int port) { networkManager.JoinYourself(port); } public void JoinYourself(int port) { networkManager.JoinYourself(port); }

View file

@ -74,6 +74,7 @@ public class SelectingServerGUI : AbstractGUI
{ {
if (int.TryParse(endpoint[1], out port)) if (int.TryParse(endpoint[1], out port))
{ {
client.JoinRoom(endpoint[0], port); client.JoinRoom(endpoint[0], port);
AppManager.Instance.SetClient(client); AppManager.Instance.SetClient(client);
AppManager.Instance.SetGUI(new WaitingForPlayersGUI(false)); AppManager.Instance.SetGUI(new WaitingForPlayersGUI(false));

View file

@ -20,11 +20,13 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
private IPEndPoint endPoint; private IPEndPoint endPoint;
private Socket socket; private Socket socket;
List<UpdateData> updates = new List<UpdateData>(); List<UpdateData> updates = new List<UpdateData>();
private List<Datagramm> waitingDatagramm = new List<Datagramm>();
private int currentServerDatagrammId = 0;
public delegate void OnDataSent(string Data); public delegate void OnDataSent(string Data);
public event OnDataSent GetDataSent; // event public event OnDataSent GetDataSent; // event
public bool IsConnected { get { return socket.Connected; } } public bool IsConnected { get { return socket.Connected; } }
public IPEndPoint InfoConnect => (IPEndPoint)socket.LocalEndPoint ?? endPoint; public IPEndPoint InfoConnect => (IPEndPoint)socket.LocalEndPoint ?? endPoint;
public EndPoint EndPointServer { get; set; }
public ClientNetworkManager() public ClientNetworkManager()
{ {
Init(); Init();
@ -51,12 +53,66 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
updates.Add(UpdateData); updates.Add(UpdateData);
} }
#region Working With Data RDP
public void AnalyzeData(string data)
{
Datagramm Dgramm = JsonSerializer.Deserialize<Datagramm>(data);
if (Dgramm.isImportant)
{
if (Dgramm.DatagrammId == currentServerDatagrammId + 1)
{
ExecuteDatagramm(Dgramm);
currentServerDatagrammId++;
CheckDatagramm();
}
else if (Dgramm.DatagrammId > currentServerDatagrammId + 1)
{
waitingDatagramm.Add(Dgramm);
}
else
{
Console.WriteLine("Апдейты " + Dgramm.DatagrammId + ", уже приходили, пропускаем");
}
SendAcknowledgement(Dgramm.DatagrammId);
}
else
{
ExecuteDatagramm(Dgramm);
}
}
public void SendAcknowledgement(int DatagrammId)
{
Datagramm Dgramm = new Datagramm() { DatagrammId = DatagrammId };
string data = JsonSerializer.Serialize(Dgramm);
byte[] buffer = Encoding.UTF8.GetBytes(data);
socket.SendTo(buffer, EndPointServer);
}
void CheckDatagramm()
{
Datagramm orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1);
while (orderedDgramm != null)
{
ExecuteDatagramm(orderedDgramm);
currentServerDatagrammId++;
orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1);
}
}
void ExecuteDatagramm(Datagramm Dgramm)
{
//Достаёт Update и передает в ивент
}
#endregion
public void StopConnection() public void StopConnection()
{ {
socket.Shutdown(SocketShutdown.Both); socket.Shutdown(SocketShutdown.Both);
socket.Close(); socket.Close();
} }
#region Join
/// <summary> /// <summary>
/// приложение пытается подключиться к комнате /// приложение пытается подключиться к комнате
/// </summary> /// </summary>
@ -95,7 +151,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
listen.IsBackground = true; listen.IsBackground = true;
listen.Start(); listen.Start();
} }
#endregion
public static IPAddress GetIp() public static IPAddress GetIp()
{ {
string hostName = Dns.GetHostName(); // Retrive the Name of HOST string hostName = Dns.GetHostName(); // Retrive the Name of HOST
@ -114,12 +170,16 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
//поток 2 //поток 2
public void StartListening() public void StartListening()
{ {
while(socket.Connected) byte[] buffer = new byte[65535];
string data;
while (socket != null)
{ {
byte[] bytes = new byte[65535]; EndPoint senderRemote = new IPEndPoint(IPAddress.Any, 0);
var countAnsw = socket.Receive(bytes, SocketFlags.Partial); //Вылетает если кто то закрыл int size = socket.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref senderRemote);
string update = Encoding.UTF8.GetString(bytes, 0, countAnsw); // обновление отосланные сервером byte[] correctedBuffer = new byte[size];
GetDataSent(update); Array.Copy(buffer, correctedBuffer, size);
data = Encoding.UTF8.GetString(correctedBuffer);
AnalyzeData(data);
} }
} }
} }