RDP-Packing fix
This commit is contained in:
parent
5f902bed7a
commit
93125d97cd
3 changed files with 35 additions and 30 deletions
|
@ -19,7 +19,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
{
|
{
|
||||||
public class ClientNetworkManager
|
public class ClientNetworkManager
|
||||||
{
|
{
|
||||||
private int port = 0;
|
private int PlayerId;
|
||||||
private IPEndPoint endPoint;
|
private IPEndPoint endPoint;
|
||||||
private IPEndPoint sendingEP;
|
private IPEndPoint sendingEP;
|
||||||
private Socket socket;
|
private Socket socket;
|
||||||
|
@ -71,29 +71,32 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
JToken token = JToken.FromObject(jObj);
|
JToken token = JToken.FromObject(jObj);
|
||||||
JToken updateDatas = token["updateDatas"];
|
JToken updateDatas = token["updateDatas"];
|
||||||
Datagramm Dgramm = new Datagramm();
|
Datagramm Dgramm = new Datagramm();
|
||||||
|
if (PlayerId == 0)
|
||||||
|
{
|
||||||
|
PlayerId = token["PlayerId"].ToObject<int>();
|
||||||
|
}
|
||||||
Dgramm.isImportant = token["isImportant"].ToObject<bool>();
|
Dgramm.isImportant = token["isImportant"].ToObject<bool>();
|
||||||
Dgramm.DatagrammId = token["DatagrammId"].ToObject<int>();
|
Dgramm.DatagrammId = token["DatagrammId"].ToObject<int>();
|
||||||
Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]);
|
|
||||||
if (Dgramm.isImportant)
|
if (Dgramm.isImportant)
|
||||||
{
|
{
|
||||||
if (Dgramm.DatagrammId == currentServerDatagrammId + 1)
|
if (Dgramm.DatagrammId == currentServerDatagrammId + 1)
|
||||||
{
|
{
|
||||||
ExecuteDatagramm(Dgramm);
|
|
||||||
currentServerDatagrammId++;
|
currentServerDatagrammId++;
|
||||||
|
Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]);
|
||||||
|
ExecuteDatagramm(Dgramm);
|
||||||
CheckDatagramm();
|
CheckDatagramm();
|
||||||
}
|
}
|
||||||
else if (Dgramm.DatagrammId > currentServerDatagrammId + 1)
|
else if (Dgramm.DatagrammId > currentServerDatagrammId + 1 &&
|
||||||
|
waitingDatagramm.Find(x => x.DatagrammId == Dgramm.DatagrammId) == null)
|
||||||
{
|
{
|
||||||
|
Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]);
|
||||||
waitingDatagramm.Add(Dgramm);
|
waitingDatagramm.Add(Dgramm);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
Console.WriteLine("Апдейты " + Dgramm.DatagrammId + ", уже приходили, пропускаем");
|
|
||||||
}
|
|
||||||
SendAcknowledgement(Dgramm.DatagrammId);
|
SendAcknowledgement(Dgramm.DatagrammId);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]);
|
||||||
ExecuteDatagramm(Dgramm);
|
ExecuteDatagramm(Dgramm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,7 +165,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
public void SendAcknowledgement(int DatagrammId)
|
public void SendAcknowledgement(int DatagrammId)
|
||||||
{
|
{
|
||||||
|
|
||||||
Datagramm Dgramm = new Datagramm() { DatagrammId = DatagrammId };
|
Datagramm Dgramm = new Datagramm() { DatagrammId = DatagrammId, PlayerId = PlayerId };
|
||||||
string data = System.Text.Json.JsonSerializer.Serialize(Dgramm);
|
string data = System.Text.Json.JsonSerializer.Serialize(Dgramm);
|
||||||
byte[] buffer = Encoding.UTF8.GetBytes(data);
|
byte[] buffer = Encoding.UTF8.GetBytes(data);
|
||||||
socket.SendTo(buffer, sendingEP);
|
socket.SendTo(buffer, sendingEP);
|
||||||
|
@ -173,8 +176,9 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
Datagramm orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1);
|
Datagramm orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1);
|
||||||
while (orderedDgramm != null)
|
while (orderedDgramm != null)
|
||||||
{
|
{
|
||||||
ExecuteDatagramm(orderedDgramm);
|
|
||||||
currentServerDatagrammId++;
|
currentServerDatagrammId++;
|
||||||
|
ExecuteDatagramm(orderedDgramm);
|
||||||
|
waitingDatagramm.Remove(orderedDgramm);
|
||||||
orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1);
|
orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
public class ServerNetworkManager
|
public class ServerNetworkManager
|
||||||
{
|
{
|
||||||
private Socket socket;
|
private Socket socket;
|
||||||
private IPAddress ip = IPAddress.Parse("127.0.0.1");
|
private IPAddress ip;
|
||||||
private bool isMultiplayer;
|
private bool isMultiplayer;
|
||||||
//Player Id to Player endPoint
|
//Player Id to Player endPoint
|
||||||
private List<IPEndPoint> clientsEP;
|
private List<IPEndPoint> clientsEP;
|
||||||
|
@ -28,9 +28,8 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
private List<UpdateData> commonUpdates;
|
private List<UpdateData> commonUpdates;
|
||||||
private List<UpdateData> importantUpdates;
|
private List<UpdateData> importantUpdates;
|
||||||
private List<Datagramm> sendedData;
|
private List<Datagramm> sendedData;
|
||||||
private List<int> arrivingDataId = new List<int>();
|
private List<Datagramm> arrivingDataId;
|
||||||
private int currentDatagrammId = 1;
|
private int currentDatagrammId = 1;
|
||||||
private int nextPlayerId = 0;
|
|
||||||
public delegate void OnDataSend(string data);
|
public delegate void OnDataSend(string data);
|
||||||
public event OnDataSend GetDataSend; // event
|
public event OnDataSend GetDataSend; // event
|
||||||
Thread serverThread;
|
Thread serverThread;
|
||||||
|
@ -48,6 +47,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
commonUpdates = new List<UpdateData>();
|
commonUpdates = new List<UpdateData>();
|
||||||
importantUpdates = new List<UpdateData>();
|
importantUpdates = new List<UpdateData>();
|
||||||
sendedData = new List<Datagramm>();
|
sendedData = new List<Datagramm>();
|
||||||
|
arrivingDataId = new List<Datagramm>();
|
||||||
|
|
||||||
GetDataSend += AnalyzeData;
|
GetDataSend += AnalyzeData;
|
||||||
|
|
||||||
|
@ -101,37 +101,37 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
#endregion
|
#endregion
|
||||||
if (arrivingDataId.Count != 0)
|
if (arrivingDataId.Count != 0)
|
||||||
{
|
{
|
||||||
List<int> actualArrivingId = arrivingDataId;
|
List<Datagramm> actualArrivingId = arrivingDataId;
|
||||||
for (int i = 0; i < actualArrivingId.Count; i++)
|
for (int i = 0; i < actualArrivingId.Count; i++)
|
||||||
{
|
{
|
||||||
sendedData.Remove(sendedData.Find(x => x.DatagrammId == actualArrivingId[i]));
|
sendedData.Remove(sendedData.Find(x => x.DatagrammId == actualArrivingId[i].DatagrammId
|
||||||
|
&& x.PlayerId == actualArrivingId[i].PlayerId));
|
||||||
}
|
}
|
||||||
arrivingDataId.Clear();
|
arrivingDataId.Clear();
|
||||||
}
|
}
|
||||||
List<UpdateData> dataToSend;
|
List<UpdateData> dataToSend;
|
||||||
if (importantUpdates.Count != 0)
|
if (importantUpdates.Count != 0 || sendedData.Count != 0)
|
||||||
{
|
{
|
||||||
Datagramm impDgramm = new Datagramm();
|
|
||||||
impDgramm.DatagrammId = currentDatagrammId;
|
|
||||||
currentDatagrammId++;
|
|
||||||
|
|
||||||
dataToSend = new List<UpdateData>();
|
dataToSend = new List<UpdateData>();
|
||||||
for (int i = 0; i < 200 && i < importantUpdates.Count; i++)
|
for (int i = 0; i < 200 && i < importantUpdates.Count; i++)
|
||||||
dataToSend.Add(importantUpdates[i]);
|
dataToSend.Add(importantUpdates[i]);
|
||||||
|
|
||||||
|
for (int i = 0; i < clientsEP.Count; i++)
|
||||||
|
{
|
||||||
|
Datagramm impDgramm = new Datagramm();
|
||||||
|
impDgramm.DatagrammId = currentDatagrammId;
|
||||||
impDgramm.updateDatas = dataToSend;
|
impDgramm.updateDatas = dataToSend;
|
||||||
impDgramm.isImportant = true;
|
impDgramm.isImportant = true;
|
||||||
|
impDgramm.PlayerId = i + 1;
|
||||||
sendedData.Add(impDgramm);
|
sendedData.Add(impDgramm);
|
||||||
foreach (Datagramm Dgramm in sendedData)
|
foreach (Datagramm Dgramm in sendedData.Where(x => x.PlayerId == i+1))
|
||||||
{
|
{
|
||||||
|
|
||||||
string impData = JsonSerializer.Serialize(Dgramm);
|
string impData = JsonSerializer.Serialize(Dgramm);
|
||||||
byte[] impBuffer = Encoding.UTF8.GetBytes(impData);
|
byte[] impBuffer = Encoding.UTF8.GetBytes(impData);
|
||||||
foreach (EndPoint sendingEP in clientsEP)
|
socket.SendTo(impBuffer, clientsEP[i]);
|
||||||
{
|
|
||||||
socket.SendTo(impBuffer, sendingEP);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
currentDatagrammId++;
|
||||||
for (int i = 0; i < 200 && i < dataToSend.Count; i++)
|
for (int i = 0; i < 200 && i < dataToSend.Count; i++)
|
||||||
importantUpdates.RemoveAt(0);
|
importantUpdates.RemoveAt(0);
|
||||||
}
|
}
|
||||||
|
@ -213,7 +213,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
if (Dgramm.updateDatas == null)
|
if (Dgramm.updateDatas == null)
|
||||||
{
|
{
|
||||||
//Обработка acknowledgement
|
//Обработка acknowledgement
|
||||||
arrivingDataId.Add(Dgramm.DatagrammId);
|
arrivingDataId.Add(Dgramm);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,5 +11,6 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates
|
||||||
public int DatagrammId { get; set; }
|
public int DatagrammId { get; set; }
|
||||||
public bool isImportant { get; set; }
|
public bool isImportant { get; set; }
|
||||||
public List<UpdateData> updateDatas { get; set; }
|
public List<UpdateData> updateDatas { get; set; }
|
||||||
|
public int PlayerId { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue