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)
{
EndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), port);
networkManager.EndPointServer = endPoint;
networkManager.JoinRoom(ip, 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))
{
client.JoinRoom(endpoint[0], port);
AppManager.Instance.SetClient(client);
AppManager.Instance.SetGUI(new WaitingForPlayersGUI(false));

View file

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