RDP-ServerNM
This commit is contained in:
parent
36ec49f04b
commit
dae5cab5c6
4 changed files with 125 additions and 93 deletions
|
@ -41,7 +41,7 @@ public class SelectModeMenu : AbstractGUI
|
||||||
// single
|
// single
|
||||||
Server server = new Server();
|
Server server = new Server();
|
||||||
Client client = new Client();
|
Client client = new Client();
|
||||||
server.CreateRoom(1);
|
server.CreateRoom(false);
|
||||||
client.JoinYourself(server.MyIp.Port);
|
client.JoinYourself(server.MyIp.Port);
|
||||||
AppManager.Instance.SetServer(server);
|
AppManager.Instance.SetServer(server);
|
||||||
AppManager.Instance.SetClient(client);
|
AppManager.Instance.SetClient(client);
|
||||||
|
|
|
@ -104,7 +104,7 @@ public class SelectingServerGUI : AbstractGUI
|
||||||
// host
|
// host
|
||||||
Server server = new Server(); //Server Logic MultiPlayer
|
Server server = new Server(); //Server Logic MultiPlayer
|
||||||
Client client = new Client();
|
Client client = new Client();
|
||||||
server.CreateRoom(2);
|
server.CreateRoom(true);
|
||||||
client.JoinYourself(server.MyIp.Port);
|
client.JoinYourself(server.MyIp.Port);
|
||||||
AppManager.Instance.SetServer(server);
|
AppManager.Instance.SetServer(server);
|
||||||
AppManager.Instance.SetClient(client);
|
AppManager.Instance.SetClient(client);
|
||||||
|
|
|
@ -18,17 +18,21 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
{
|
{
|
||||||
public class ServerNetworkManager
|
public class ServerNetworkManager
|
||||||
{
|
{
|
||||||
private IPAddress ip = IPAddress.Parse("127.0.0.1");
|
|
||||||
private const int port = 0;
|
|
||||||
private IPEndPoint endPoint;
|
|
||||||
private Socket socket;
|
private Socket socket;
|
||||||
private List<Socket> clients;
|
private IPAddress ip = IPAddress.Parse("127.0.0.1");
|
||||||
public List<UpdateData> updates;
|
private bool isMultiplayer;
|
||||||
|
//Player Id to Player endPoint
|
||||||
|
private List<IPEndPoint> clientsEP;
|
||||||
|
private IPEndPoint endPoint;
|
||||||
|
private List<UpdateData> commonUpdates;
|
||||||
|
private List<UpdateData> importantUpdates;
|
||||||
|
private List<Datagramm> sendedData;
|
||||||
|
private List<int> arrivingDataId = new List<int>();
|
||||||
|
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
|
||||||
Dictionary<Socket, Thread> managerThread;
|
Thread serverThread;
|
||||||
Thread serverTheread;
|
|
||||||
public IPEndPoint InfoConnect => (IPEndPoint)socket.LocalEndPoint ?? endPoint;
|
|
||||||
|
|
||||||
public ServerNetworkManager() { Init(); }
|
public ServerNetworkManager() { Init(); }
|
||||||
|
|
||||||
|
@ -37,12 +41,18 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void Init()
|
private void Init()
|
||||||
{
|
{
|
||||||
endPoint = new IPEndPoint(GetIp(), port);
|
endPoint = new IPEndPoint(GetIp(), 8080);
|
||||||
|
sendedData = new List<Datagramm>();
|
||||||
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
|
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
|
||||||
managerThread = new Dictionary<Socket, Thread>();
|
clientsEP = new List<IPEndPoint>();
|
||||||
clients = new List<Socket>();
|
commonUpdates = new List<UpdateData>();
|
||||||
updates = new List<UpdateData>();
|
importantUpdates = new List<UpdateData>();
|
||||||
|
sendedData = new List<Datagramm>();
|
||||||
|
|
||||||
|
GetDataSend += AnalyzeData;
|
||||||
|
|
||||||
socket.Bind(endPoint);
|
socket.Bind(endPoint);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -63,32 +73,77 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
}
|
}
|
||||||
return IPAddress.Loopback;
|
return IPAddress.Loopback;
|
||||||
}
|
}
|
||||||
|
public void SetIsMultiplayer(bool isMultiplayer)
|
||||||
|
{
|
||||||
|
this.isMultiplayer = isMultiplayer;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// отправляет клиенту Data
|
/// отправляет клиенту Data
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendData()
|
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]);
|
// AppManager.Instance.client.GotData(updates[i]);
|
||||||
}
|
//}
|
||||||
updates.Clear();
|
//updates.Clear();
|
||||||
return; //TODO TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK TODO REMOVE TO ADD NETWORK
|
//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
|
//по 10 паков за раз TODO FIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXITFIXIT
|
||||||
List<UpdateData> datasToSend = new List<UpdateData>();
|
#endregion
|
||||||
for (int i = 0; i < 200 && i<updates.Count; i++)
|
if (arrivingDataId.Count != 0)
|
||||||
datasToSend.Add(updates[i]);
|
|
||||||
string data = JsonSerializer.Serialize(datasToSend);
|
|
||||||
var databytes = Encoding.UTF8.GetBytes(data);
|
|
||||||
foreach (Socket socket in clients)
|
|
||||||
{
|
{
|
||||||
clients[0].SendAsync(databytes, SocketFlags.Partial);
|
List<int> 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++)
|
List<UpdateData> dataToSend;
|
||||||
updates.RemoveAt(0);
|
if (importantUpdates.Count != 0)
|
||||||
|
{
|
||||||
|
Datagramm impDgramm = new Datagramm();
|
||||||
|
impDgramm.DatagrammId = currentDatagrammId;
|
||||||
|
currentDatagrammId++;
|
||||||
|
|
||||||
|
dataToSend = new List<UpdateData>();
|
||||||
|
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<UpdateData>();
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -97,42 +152,24 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
/// <param name="data"></param>
|
/// <param name="data"></param>
|
||||||
public void AddData(UpdateData data)
|
public void AddData(UpdateData data)
|
||||||
{
|
{
|
||||||
updates.Add(data);
|
if (data.isImportant)
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// По сути конец игры и отключение игроков
|
|
||||||
/// </summary>
|
|
||||||
public void CloseConnection()
|
|
||||||
{
|
|
||||||
foreach (var item in clients)
|
|
||||||
{
|
{
|
||||||
//Закрывает сокеты клиентов
|
importantUpdates.Add(data);
|
||||||
item.Shutdown(SocketShutdown.Both);
|
|
||||||
item.Close();
|
|
||||||
}
|
}
|
||||||
foreach (var item in managerThread)
|
else {
|
||||||
{
|
commonUpdates.Add(data);
|
||||||
foreach (var socket in clients)
|
|
||||||
{
|
|
||||||
//Закрывает потоки клиентов
|
|
||||||
managerThread[socket].Interrupt();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//очищает листы
|
|
||||||
managerThread.Clear();
|
|
||||||
clients.Clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Начинает работу сервера (Ожидает подключений)
|
/// Начинает работу сервера (Ожидает подключений)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="players"></param>
|
/// <param name="players"></param>
|
||||||
public void Start(object players)
|
public void Start()
|
||||||
{
|
{
|
||||||
serverTheread = new Thread(StartWaitingForPlayers);
|
serverThread = new Thread(StartWaitingForPlayers);
|
||||||
serverTheread.IsBackground = true;
|
serverThread.IsBackground = true;
|
||||||
serverTheread.Start(players);
|
serverThread.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
//Потоки Клиентов
|
//Потоки Клиентов
|
||||||
|
@ -140,42 +177,42 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
|
||||||
/// Слушает игроков, которые хотят подключиться
|
/// Слушает игроков, которые хотят подключиться
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="players"></param>
|
/// <param name="players"></param>
|
||||||
public void StartWaitingForPlayers(object players)
|
public void StartWaitingForPlayers()
|
||||||
{
|
{
|
||||||
int playNumber = (int)players;
|
byte[] buffer = new byte[65535];
|
||||||
|
string data;
|
||||||
socket.Listen(playNumber);
|
while (socket != null)
|
||||||
for (int i = 0; i < playNumber; i++)
|
|
||||||
{
|
{
|
||||||
Socket client = socket.Accept();
|
EndPoint senderRemote = (EndPoint)new IPEndPoint(IPAddress.Any, 0);
|
||||||
AppManager.Instance.debugHud.Log($"Connect {client.LocalEndPoint.ToString()}");
|
int size = socket.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref senderRemote);
|
||||||
Thread thread = new Thread(StartListening);
|
if (AppManager.Instance.gamestate != GameState.HostPlaying && !clientsEP.Contains(senderRemote) &&
|
||||||
thread.IsBackground = true;
|
senderRemote != new IPEndPoint(IPAddress.Any, 0))
|
||||||
thread.Start(client);
|
{
|
||||||
managerThread.Add(client, thread);
|
clientsEP.Add((IPEndPoint)senderRemote);
|
||||||
clients.Add(client);
|
AppManager.Instance.debugHud.Log($"Connect {senderRemote.ToString()}");
|
||||||
//AppManager.Instance.ChangeState(GameState.HostPlaying);
|
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);
|
|
||||||
}
|
}
|
||||||
|
public void AnalyzeData(string data)
|
||||||
/// <summary>
|
|
||||||
/// начать слушать клиентов в самой игре активируют Ивент
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="socket"></param>
|
|
||||||
private void StartListening(object socket)
|
|
||||||
{
|
{
|
||||||
// obj to Socket
|
Datagramm Dgramm = JsonSerializer.Deserialize<Datagramm>(data);
|
||||||
Socket client = (Socket)socket;
|
if (Dgramm.updateDatas == null)
|
||||||
while (client.Connected)
|
|
||||||
{
|
{
|
||||||
var buff = new byte[65535];
|
//Обработка acknowledgement
|
||||||
var answ = client.Receive(buff, SocketFlags.Partial);
|
arrivingDataId.Add(Dgramm.DatagrammId);
|
||||||
string response = Encoding.UTF8.GetString(buff, 0, answ);
|
}
|
||||||
GetDataSend(response);
|
else
|
||||||
|
{
|
||||||
|
//Настроить десериализацию и применять неважные апдейты
|
||||||
}
|
}
|
||||||
Task.Delay(-1);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,11 +29,10 @@ namespace ZoFo.GameCore
|
||||||
{
|
{
|
||||||
private ServerNetworkManager networkManager;
|
private ServerNetworkManager networkManager;
|
||||||
private int ticks = 0;
|
private int ticks = 0;
|
||||||
public IPEndPoint MyIp { get { return networkManager.InfoConnect; } }
|
//public IPEndPoint MyIp { get { return networkManager.InfoConnect; } }
|
||||||
public Server()
|
public Server()
|
||||||
{
|
{
|
||||||
networkManager = new ServerNetworkManager();
|
networkManager = new ServerNetworkManager();
|
||||||
networkManager.GetDataSend += OnDataSend;
|
|
||||||
collisionManager = new CollisionManager();
|
collisionManager = new CollisionManager();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -86,10 +85,6 @@ namespace ZoFo.GameCore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CloseConnection()
|
|
||||||
{
|
|
||||||
networkManager.CloseConnection();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Для красоты) Отдел Серверов
|
/// Для красоты) Отдел Серверов
|
||||||
|
@ -105,9 +100,10 @@ namespace ZoFo.GameCore
|
||||||
/// Создает комнату и запускает ожидание подключений
|
/// Создает комнату и запускает ожидание подключений
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="players"></param>
|
/// <param name="players"></param>
|
||||||
public void CreateRoom(int players)
|
public void CreateRoom(bool isMultiplayer)
|
||||||
{
|
{
|
||||||
networkManager.Start(players);
|
networkManager.SetIsMultiplayer(isMultiplayer);
|
||||||
|
networkManager.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -142,7 +138,6 @@ namespace ZoFo.GameCore
|
||||||
{
|
{
|
||||||
UpdateGameEnded gameEnded = new UpdateGameEnded();
|
UpdateGameEnded gameEnded = new UpdateGameEnded();
|
||||||
networkManager.AddData(gameEnded);
|
networkManager.AddData(gameEnded);
|
||||||
networkManager.CloseConnection();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<GameObject> gameObjects;
|
public List<GameObject> gameObjects;
|
||||||
|
|
Loading…
Add table
Reference in a new issue