From 2ef1c5de3cfcc7104df3ebb50eaf064183ffc97a Mon Sep 17 00:00:00 2001 From: OPALVENS Florence <fopalvens@ad.unistra.fr> Date: Tue, 10 Jan 2017 23:18:56 +0100 Subject: [PATCH] jeu fonctionnel --- Tron/TronClient/TronClient/Client.cs | 31 +++++----- Tron/TronServeur/TronServeur/Program.cs | 75 +++++++++++++------------ 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/Tron/TronClient/TronClient/Client.cs b/Tron/TronClient/TronClient/Client.cs index 1ca1b3f..a9319c6 100644 --- a/Tron/TronClient/TronClient/Client.cs +++ b/Tron/TronClient/TronClient/Client.cs @@ -13,36 +13,38 @@ namespace TronClient private Tron.Tron myTron; // Moteur du jeu public byte frequence; // Temps du tour de jeu (en dixieme de s) Socket clientSocket; - int serverPort = 17021; - string serverIP = "130.79.81.203"; - const int MsgsBufferSize = 100000000; - EndPoint serverEP; + int serverPort; + String serverIP; // constructeur : IP/Port du serveur public Client(String myServerIP, int myServerPort) { // TODO : Creation de la socket d'écoute TCP clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + this.serverIP = myServerIP; + this.serverPort = myServerPort; } - // Appelé au début de la partie public Tron.Tron Init() { System.Console.WriteLine("Init"); // TODO Connexion au serveur - clientSocket.Bind(new IPEndPoint(IPAddress.Any, 56000)); - serverEP = new IPEndPoint(IPAddress.Parse(serverIP), serverPort); + Console.WriteLine("Tentative de connexion ..."); + clientSocket.Bind(new IPEndPoint(IPAddress.Any, 0)); + IPEndPoint serverEP = new IPEndPoint(IPAddress.Parse(serverIP), serverPort); clientSocket.Connect(serverEP); + Console.WriteLine("Connexion au serveur..."); // TODO Réception des paramètres - byte[] buffer = new byte[MsgsBufferSize]; - clientSocket.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref serverEP); + byte[] buffer = new byte[4]; + clientSocket.Receive(buffer); byte myNJoueurs = buffer[0]; byte myTaille = buffer[1]; byte myFrequence = buffer[2]; byte myMonNum = buffer[3]; + Console.WriteLine("Paramètres reçus : " + buffer[0] + " " + buffer[1] + " " + buffer[2] + " " + buffer[3]); // TODO Initialisation de la fréquence : frequence = <frequence> frequence = myFrequence; @@ -60,14 +62,13 @@ namespace TronClient System.Console.WriteLine("Routine"); // TODO Envoie de sa direction : myTron.getDirection() - byte[] buffer = new byte[1]; - buffer[0] = myTron.getDirection(); - clientSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, serverEP); + byte[] maDirection = new byte[1] { myTron.getDirection() }; + clientSocket.Send(maDirection, 0, maDirection.Length, SocketFlags.None); // TOSO Reception de toutes les directions : myTron.setDirections(byte[] < toutes les directions>); - byte[] buffer_direction = new byte[MsgsBufferSize]; - clientSocket.ReceiveFrom(buffer_direction, buffer_direction.Length, SocketFlags.None, ref serverEP); - byte[] directions = buffer_direction[0]; + byte[] buffer_direction = new byte[myTron.getNJoueurs()]; + clientSocket.Receive(buffer_direction); + myTron.setDirections(buffer_direction); } diff --git a/Tron/TronServeur/TronServeur/Program.cs b/Tron/TronServeur/TronServeur/Program.cs index d2013a6..d150bf6 100644 --- a/Tron/TronServeur/TronServeur/Program.cs +++ b/Tron/TronServeur/TronServeur/Program.cs @@ -16,74 +16,78 @@ namespace TronServeur Tron.Tron myTron; // Moteur du jeu byte nJoueurs = 2; // Nombre de joueurs - byte frequence = 10; // Temps du tour de jeu (en dixieme de s) + byte frequence = 1; // Temps du tour de jeu (en dixieme de s) byte taille = 60; // Taille du terrain - string serverAdress = "127.0.0.1"; - int port = 17021; + // ************************************* Intitialisation partie Console.WriteLine("Initialisation"); // TODO Creation de la socket d'écoute TCP - Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // TODO Creation du tableau des sockets connectées - List<Socket> listClients = new List<Socket>(); + Socket[] socketJoueurs = new Socket[nJoueurs]; + bool[] joueursConnectes = new bool[nJoueurs]; // Creation du moteur de jeu myTron = new Tron.Tron(nJoueurs, taille); // TODO Bind et listen - serverSocket.Bind(new IPEndPoint(IPAddress.Any, port)); - serverSocket.Listen(10); + listenSocket.Bind(new IPEndPoint(IPAddress.Any, 8000)); + listenSocket.Listen(10); + Console.WriteLine("Attente d'une nouvelle connexion ..."); // TODO Acceptation des clients for (int i = 0; i < nJoueurs; i++) { - Socket connectedSocket = serverSocket.Accept(); - listClients.Add(connectedSocket); - Console.WriteLine("Client ajouté !"); + socketJoueurs[i] = listenSocket.Accept(); + Console.WriteLine("Nouvelle connexion : " + socketJoueurs[i].RemoteEndPoint); + joueursConnectes[i] = true; } - + // TODO Envoie des paramètres - byte[] infos = new byte[4]; - infos[0] = nJoueurs; - infos[1] = taille; - infos[2] = frequence; - - for (byte i = 1; i <= listClients.Count; i++) + for (int i = 0; i < nJoueurs; i++) { - infos[3] = i; - listClients[i-1].Send(infos, 0, infos.Length, SocketFlags.None); + byte[] buffer = new byte[] { nJoueurs, taille, frequence, (byte)i }; + socketJoueurs[i].Send(buffer); } // ************************************* Routine à chaque tour System.Console.WriteLine("Routine"); - byte[] directions; + // Tant que la partie n'est pas finie while (!myTron.IsFinished()) { // TODO Réception de la direction de chaque joueur - directions = new byte[listClients.Count]; - - for(byte i = 0; i < listClients.Count; i++) + byte[] bufferDirection = new byte[nJoueurs]; + for (int i = 0; i < nJoueurs; i++) { - - byte []direction = new byte[1]; - listClients[i].Receive(direction, direction.Length, SocketFlags.None); - directions[i] = direction[0]; + try + { + byte[] dirRecue = new byte[1]; + socketJoueurs[i].Receive(dirRecue); + bufferDirection[i] = dirRecue[0]; + } + catch + { + bufferDirection[i] = 4; + socketJoueurs[i] = null; + + if (socketJoueurs.Count() == 1) + bufferDirection[i] = 5; + } } // TODO Calcul collision : myTron.Collision(byte[] <toutes les directions>); - myTron.Collision(directions); + myTron.Collision(bufferDirection); // TODO Envoie des directions de tous les joueurs à tous les clients - directions = myTron.getDirections(); - - for (byte i = 0; i < listClients.Count; i++) + for (int i = 0; i < nJoueurs; i++) { - listClients[i].Send(directions, 0, directions.Length, SocketFlags.None); + if (socketJoueurs[i] != null) + socketJoueurs[i].Send(myTron.getDirections()); } } @@ -92,13 +96,14 @@ namespace TronServeur System.Console.WriteLine("Conclusion"); // TODO Fermeture des sockets connectées - foreach(Socket s in listClients) + for(int i = 0; i < socketJoueurs.Length; i++) { - s.Close(); + if (socketJoueurs[i] != null) + socketJoueurs[i].Close(); } // TODO Fermeture socket d'écoute - serverSocket.Close(); + listenSocket.Close(); } } -- GitLab