diff --git a/code/server/Server/PongServer.cs b/code/server/Server/PongServer.cs index bd9fa6a..01e5fd8 100644 --- a/code/server/Server/PongServer.cs +++ b/code/server/Server/PongServer.cs @@ -62,17 +62,16 @@ public class PongServer Console.WriteLine("Connection " + choisenRoom.Key); if (choisenRoom.Value != default ) { - Thread join = new Thread(() => Join(data, remoteEndPoint, serverSocket, choisenRoom.Value)); - join.Start(); + Join(data, remoteEndPoint, serverSocket, choisenRoom.Value); } else { - Thread host = new Thread(() => Host(data, remoteEndPoint, serverSocket, true)); - host.Start(); + Host(data, remoteEndPoint, serverSocket, true); } } + Console.WriteLine(""); } @@ -80,11 +79,20 @@ public class PongServer private void Host(ObjectTransfert data, IPEndPoint remoteEndPoint, UdpClient serverSocket, bool availaible) { + var choisenRoom = rooms.FirstOrDefault(room => room.Value.Free); + var chosenPort = nextPort; + if (choisenRoom.Value != default) + { + chosenPort= choisenRoom.Value.Port; + rooms.Remove(choisenRoom.Key); + choisenRoom = default; + } + Room room = new Room(data.Data.playerId, availaible); // Assign a unique port to the client - IPEndPoint clientEndPoint = new IPEndPoint(IPAddress.Any, nextPort); + IPEndPoint clientEndPoint = new IPEndPoint(IPAddress.Any, chosenPort); UdpClient clientSocket = new UdpClient(clientEndPoint); room.playerHost = new KeyValuePair(data.Data,clientSocket); @@ -95,8 +103,12 @@ public class PongServer Console.WriteLine("New connection Host From " + remoteEndPoint.ToString()); - room.Port = nextPort; - nextPort++; + room.Port = chosenPort; + if(chosenPort==nextPort) + { + nextPort++; + } + Tuple dataToSend = new Tuple(room.Port, true); @@ -107,7 +119,7 @@ public class PongServer serverSocket.Send(connectionData, connectionData.Length, remoteEndPoint); rooms[data.Data.playerId] = room; - room.PropertyChanged += room.OnReadyChanged; + Console.WriteLine("FIN HOST..............."); diff --git a/code/server/Server/Room.cs b/code/server/Server/Room.cs index 76a33b6..15ff422 100644 --- a/code/server/Server/Room.cs +++ b/code/server/Server/Room.cs @@ -22,8 +22,13 @@ namespace Server Availaible = availaible; } Tuple ScoreImp = new(0, 0); + + ObjectTransfert>> data ; + public bool Availaible { get; set; } + public bool Free { get; set; }=false; + public event PropertyChangedEventHandler? PropertyChanged; public string Id { get; set; } @@ -64,30 +69,69 @@ namespace Server IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); Thread secondsCount = new Thread(() => CountSeconds() ); - + bool isDisconected=false; secondsCount.Start(); while ((ScoreImp.Item1<6 && ScoreImp.Item2 < 6) && gameRunning) { - byte[] receivedData = clientSocket1.Receive(ref remoteEndPoint); - if (isHost) { - string fileJson = Encoding.UTF8.GetString(receivedData); + try + { + byte[] receivedData = clientSocket1.Receive(ref remoteEndPoint); + if (isHost) { + string fileJson = Encoding.UTF8.GetString(receivedData); + try + { + data = JsonSerializer.Deserialize>>>(fileJson); + ScoreImp = data.Data.Item2 != null ? data.Data.Item2 : ScoreImp; + } + catch (Exception ex) { } + + } + semaphore.WaitOne(); + clientSocket2.Send(receivedData, receivedData.Length, endpoint2); + semaphore.Release(); + + } catch (SocketException){ try { - ObjectTransfert>> data = JsonSerializer.Deserialize>>>(fileJson); - ScoreImp = data.Data.Item2 != null ? data.Data.Item2 : ScoreImp; - } - catch (Exception ex) { } - + semaphore.Release(); + + }catch { } + isDisconected = true; + break; } - - semaphore.WaitOne(); + } + //Tuple> game = new Tuple>(new GameEntities(new Tuple(0,0),0), ScoreImp); + /* ObjectTransfert>> data2 = new ObjectTransfert>>() { + Informations = new Informations(Shared.DTO.Action.End, 0, typeof(Tuple>).ToString()), + Data = game + };*/ + if (!isDisconected) + { + data.Informations.Action = Shared.DTO.Action.End; + string sendFinish = JsonSerializer.Serialize(data); + byte[] sendFinishByt = Encoding.ASCII.GetBytes(sendFinish); + try + { + clientSocket2.Send(sendFinishByt, sendFinishByt.Length, endpoint2); + } + catch (Exception ex) { } + } + if (isHost) + { + try + { + semaphore.Release(); - clientSocket2.Send(receivedData, receivedData.Length, endpoint2); - semaphore.Release(); + } + catch { } + playerJoin.Value.Close(); + } + else + { + playerHost.Value.Close(); } - Availaible = true; - + Free = true; Console.WriteLine("Game Finished Am i host " + isHost); } @@ -102,10 +146,10 @@ namespace Server gameRunning = false; } - public void OnReadyChanged(object sender, PropertyChangedEventArgs e) + async public void OnReadyChanged(object sender, PropertyChangedEventArgs e) { - /*Thread principal = new Thread(() => - {*/ + await Task.Run(() => + { Room room = sender as Room; int maxPlayer = room.nbPlayer; @@ -141,8 +185,8 @@ namespace Server receiveThread2.Join(); } - /*}); - principal.Start();*/ + }); + }