From dae5cab5c665e705dab187478ad9b7fb3216418d Mon Sep 17 00:00:00 2001 From: AnloGames <7383an@gmail.com> Date: Mon, 19 Aug 2024 11:48:57 +0300 Subject: [PATCH] RDP-ServerNM --- ZoFo/GameCore/GUI/SelectModeMenu.cs | 2 +- ZoFo/GameCore/GUI/SelectingServerGUI.cs | 2 +- .../NetworkManager/ServerNetworkManager.cs | 201 +++++++++++------- ZoFo/GameCore/Server.cs | 13 +- 4 files changed, 125 insertions(+), 93 deletions(-) diff --git a/ZoFo/GameCore/GUI/SelectModeMenu.cs b/ZoFo/GameCore/GUI/SelectModeMenu.cs index 5b1320b..32bfa38 100644 --- a/ZoFo/GameCore/GUI/SelectModeMenu.cs +++ b/ZoFo/GameCore/GUI/SelectModeMenu.cs @@ -41,7 +41,7 @@ public class SelectModeMenu : AbstractGUI // single Server server = new Server(); Client client = new Client(); - server.CreateRoom(1); + server.CreateRoom(false); client.JoinYourself(server.MyIp.Port); AppManager.Instance.SetServer(server); AppManager.Instance.SetClient(client); diff --git a/ZoFo/GameCore/GUI/SelectingServerGUI.cs b/ZoFo/GameCore/GUI/SelectingServerGUI.cs index 8558bd4..3f915ee 100644 --- a/ZoFo/GameCore/GUI/SelectingServerGUI.cs +++ b/ZoFo/GameCore/GUI/SelectingServerGUI.cs @@ -104,7 +104,7 @@ public class SelectingServerGUI : AbstractGUI // host Server server = new Server(); //Server Logic MultiPlayer Client client = new Client(); - server.CreateRoom(2); + server.CreateRoom(true); client.JoinYourself(server.MyIp.Port); AppManager.Instance.SetServer(server); AppManager.Instance.SetClient(client); diff --git a/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs b/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs index 49960ed..311f2b2 100644 --- a/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs +++ b/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs @@ -18,17 +18,21 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager { public class ServerNetworkManager { - private IPAddress ip = IPAddress.Parse("127.0.0.1"); - private const int port = 0; - private IPEndPoint endPoint; private Socket socket; - private List clients; - public List updates; + private IPAddress ip = IPAddress.Parse("127.0.0.1"); + private bool isMultiplayer; + //Player Id to Player endPoint + private List clientsEP; + private IPEndPoint endPoint; + private List commonUpdates; + private List importantUpdates; + private List sendedData; + private List arrivingDataId = new List(); + private int currentDatagrammId = 1; + private int nextPlayerId = 0; public delegate void OnDataSend(string data); public event OnDataSend GetDataSend; // event - Dictionary managerThread; - Thread serverTheread; - public IPEndPoint InfoConnect => (IPEndPoint)socket.LocalEndPoint ?? endPoint; + Thread serverThread; public ServerNetworkManager() { Init(); } @@ -37,12 +41,18 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager /// private void Init() { - endPoint = new IPEndPoint(GetIp(), port); + endPoint = new IPEndPoint(GetIp(), 8080); + sendedData = new List(); socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - managerThread = new Dictionary(); - clients = new List(); - updates = new List(); + clientsEP = new List(); + commonUpdates = new List(); + importantUpdates = new List(); + sendedData = new List(); + + GetDataSend += AnalyzeData; + socket.Bind(endPoint); + } /// @@ -63,32 +73,77 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager } return IPAddress.Loopback; } + public void SetIsMultiplayer(bool isMultiplayer) + { + this.isMultiplayer = isMultiplayer; + } /// /// отправляет клиенту Data /// public void SendData() { - for (int i = 0; i < updates.Count; i++) - { + #region Network Sending SinglePlayerFix + //for (int i = 0; i < updates.Count; i++) + //{ - AppManager.Instance.client.GotData(updates[i]); - } - updates.Clear(); - return; //TODO TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK + // AppManager.Instance.client.GotData(updates[i]); + //} + //updates.Clear(); + //return; //TODO TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK //Что это? //по 10 паков за раз TODO FIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXIT - List datasToSend = new List(); - for (int i = 0; i < 200 && i actualArrivingId = arrivingDataId; + for (int i = 0; i < actualArrivingId.Count; i++) + { + sendedData.Remove(sendedData.Find(x => x.DatagrammId == actualArrivingId[i])); + } + arrivingDataId.Clear(); } - for (int i = 0; i < 200 && i< datasToSend.Count; i++) - updates.RemoveAt(0); + List dataToSend; + if (importantUpdates.Count != 0) + { + Datagramm impDgramm = new Datagramm(); + impDgramm.DatagrammId = currentDatagrammId; + currentDatagrammId++; + + dataToSend = new List(); + for (int i = 0; i < 200 && i < importantUpdates.Count; i++) + dataToSend.Add(importantUpdates[i]); + + impDgramm.updateDatas = dataToSend; + impDgramm.isImportant = true; + sendedData.Add(impDgramm); + foreach (Datagramm Dgramm in sendedData) + { + string impData = JsonSerializer.Serialize(Dgramm); + byte[] impBuffer = Encoding.UTF8.GetBytes(impData); + foreach (EndPoint sendingEP in clientsEP) + { + socket.SendTo(impBuffer, sendingEP); + } + } + for (int i = 0; i < 200 && i < dataToSend.Count; i++) + importantUpdates.RemoveAt(0); + } + Datagramm unImpDgramm = new Datagramm(); + + dataToSend = new List(); + for (int i = 0; i < 200 && i < commonUpdates.Count; i++) + dataToSend.Add(commonUpdates[i]); + + unImpDgramm.updateDatas = dataToSend; + string data = JsonSerializer.Serialize(unImpDgramm); + byte[] buffer = Encoding.UTF8.GetBytes(data); + foreach (EndPoint sendingEP in clientsEP) + { + socket.SendTo(buffer, sendingEP); + } + for (int i = 0; i < 200 && i < dataToSend.Count; i++) + commonUpdates.RemoveAt(0); } /// @@ -97,42 +152,24 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager /// public void AddData(UpdateData data) { - updates.Add(data); - } - - /// - /// По сути конец игры и отключение игроков - /// - public void CloseConnection() - { - foreach (var item in clients) + if (data.isImportant) { - //Закрывает сокеты клиентов - item.Shutdown(SocketShutdown.Both); - item.Close(); + importantUpdates.Add(data); } - foreach (var item in managerThread) - { - foreach (var socket in clients) - { - //Закрывает потоки клиентов - managerThread[socket].Interrupt(); - } + else { + commonUpdates.Add(data); } - //очищает листы - managerThread.Clear(); - clients.Clear(); } /// /// Начинает работу сервера (Ожидает подключений) /// /// - public void Start(object players) + public void Start() { - serverTheread = new Thread(StartWaitingForPlayers); - serverTheread.IsBackground = true; - serverTheread.Start(players); + serverThread = new Thread(StartWaitingForPlayers); + serverThread.IsBackground = true; + serverThread.Start(); } //Потоки Клиентов @@ -140,42 +177,42 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager /// Слушает игроков, которые хотят подключиться /// /// - public void StartWaitingForPlayers(object players) + public void StartWaitingForPlayers() { - int playNumber = (int)players; - - socket.Listen(playNumber); - for (int i = 0; i < playNumber; i++) + byte[] buffer = new byte[65535]; + string data; + while (socket != null) { - Socket client = socket.Accept(); - AppManager.Instance.debugHud.Log($"Connect {client.LocalEndPoint.ToString()}"); - Thread thread = new Thread(StartListening); - thread.IsBackground = true; - thread.Start(client); - managerThread.Add(client, thread); - clients.Add(client); - //AppManager.Instance.ChangeState(GameState.HostPlaying); - //добавляем клиентов в лист + EndPoint senderRemote = (EndPoint)new IPEndPoint(IPAddress.Any, 0); + int size = socket.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref senderRemote); + if (AppManager.Instance.gamestate != GameState.HostPlaying && !clientsEP.Contains(senderRemote) && + senderRemote != new IPEndPoint(IPAddress.Any, 0)) + { + clientsEP.Add((IPEndPoint)senderRemote); + AppManager.Instance.debugHud.Log($"Connect {senderRemote.ToString()}"); + if (!isMultiplayer) AppManager.Instance.ChangeState(GameState.HostPlaying); + // Отправлять Init апдейт с информацией об ID игрока и ID датаграмма на сервере + //Можно добавить bool isInit для Датаграммов + } + byte[] correctedBuffer = new byte[size]; + Array.Copy(buffer, correctedBuffer, size); + data = Encoding.UTF8.GetString(correctedBuffer); + GetDataSend(data); + } - AppManager.Instance.ChangeState(GameState.HostPlaying); } - - /// - /// начать слушать клиентов в самой игре активируют Ивент - /// - /// - private void StartListening(object socket) + public void AnalyzeData(string data) { - // obj to Socket - Socket client = (Socket)socket; - while (client.Connected) + Datagramm Dgramm = JsonSerializer.Deserialize(data); + if (Dgramm.updateDatas == null) { - var buff = new byte[65535]; - var answ = client.Receive(buff, SocketFlags.Partial); - string response = Encoding.UTF8.GetString(buff, 0, answ); - GetDataSend(response); + //Обработка acknowledgement + arrivingDataId.Add(Dgramm.DatagrammId); + } + else + { + //Настроить десериализацию и применять неважные апдейты } - Task.Delay(-1); } } diff --git a/ZoFo/GameCore/Server.cs b/ZoFo/GameCore/Server.cs index 9b17e94..c813dd8 100644 --- a/ZoFo/GameCore/Server.cs +++ b/ZoFo/GameCore/Server.cs @@ -29,11 +29,10 @@ namespace ZoFo.GameCore { private ServerNetworkManager networkManager; private int ticks = 0; - public IPEndPoint MyIp { get { return networkManager.InfoConnect; } } + //public IPEndPoint MyIp { get { return networkManager.InfoConnect; } } public Server() { networkManager = new ServerNetworkManager(); - networkManager.GetDataSend += OnDataSend; collisionManager = new CollisionManager(); } @@ -86,10 +85,6 @@ namespace ZoFo.GameCore } } - public void CloseConnection() - { - networkManager.CloseConnection(); - } /// /// Для красоты) Отдел Серверов @@ -105,9 +100,10 @@ namespace ZoFo.GameCore /// Создает комнату и запускает ожидание подключений /// /// - public void CreateRoom(int players) + public void CreateRoom(bool isMultiplayer) { - networkManager.Start(players); + networkManager.SetIsMultiplayer(isMultiplayer); + networkManager.Start(); } #endregion @@ -142,7 +138,6 @@ namespace ZoFo.GameCore { UpdateGameEnded gameEnded = new UpdateGameEnded(); networkManager.AddData(gameEnded); - networkManager.CloseConnection(); } public List gameObjects;