IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Bataille navale client/serveur avec Lobby d'attente


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut Bataille navale client/serveur avec Lobby d'attente
    Bonjour,

    je suis quasiment novice en ce qui concerne la programmation client/serveur en JAVA.

    Pour l'un de mes cours, je dois réaliser un jeu de bataille navale en client/serveur avec des threads et du JSON.

    J'ai déjà créé le core du jeu mais mon souci est ailleurs.

    En effet, lorsqu'un utilisateur se connecte à mon serveur, il doit pouvoir choisir de créer une nouvelle partie ou d'en rejoindre une déjà créée (Lobby d'attente).

    Mon problème est que je ne comprends pas comment faire pour réaliser cela ni comment mes 2 joueurs vont pouvoir communiquer entre eux pour jouer l'un contre l'autre.

    Mon core du jeu se compose des classes suivantes :

    Case // case du jeu

    Contact // coordonnées

    Game // contient un match ainsi qu'une liste de joueur et une instance de Game

    Grid // Grille de mon jeu

    Match // Partie entre 2 joueurs

    Player // Joueur

    Radar // Vue sur la grille de l'adversaire

    ResultAttack // enum touché, coulé raté

    Ship // mes petits bâteaux

    State // enum du match non lancé, en cours, fini

    J'ai aussi un serveur et un threadServeur de créer mais je ne sais pas trop quoi en faire.

    Si quelqu'un pouvait m'aider je lui en serait reconnaissant.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le serveur doit maintenir une liste de parties : une ArrayList<Game> par exemple. Il faut que la classe Game dispose d'un identifiant qui permette à un client de référencer une instance de Game en particulier.

    Ensuite, comme dans tout système client/serveur, il faut que tu définisses un protocole minimum : des commandes qui permettent de communiquer. Le serveur renvoit une réponse en json : le client peut envoyer également une commande en json. Une commande c'est simplement un identifiant de commande (un mot en général) et des paramètres.

    Les échanges de base au début seront (ce sont tous des structures json, avec un identifiant de commande (de client à serveur), ou de message (de serveur à client, du type "succès", "echec", etc...), et des données :

    • un client se connecte : il envoie la commande "c'est la première fois que je me connecte et donc je voudrais la liste des parties existantes". Le serveur l'enregistre (associe son ip avec un identifiant de joueur) et lui renvoie la liste des parties existantes
    • le joueur choisit
      1. de créer une partie. Le client envoie une commande "je créé une partie", et le serveur crée une instance de Game, avec un nouvel id, et associe le joueur avec la partie, en renvoie au client un message "succès", ou "echec".
      2. une partie existante. Le client envoit une commande 'je choisis la partie d'identifiant "xxx"". Le serveur vérifie que cette partie existe, peut prendre un nouveau joueur, et, si oui, fait l'association du joueur avec la partie, et renvoie au client "succès", et sinon renvoie "echec", avec une message ("la partie a été fermée", "il y a déjà le nombre de joueurs maximum", etc.
      3. etc.


    Pour le déroulement de la partie, tu es en client/serveur : les clients ne communiquent donc pas entre eux (peer-to-peer), mais toujours via le serveur. Donc quand un joueur joue, le client envoie les données correspondant au coup joué au serveur (une commande + des paramètres) et reçoit le résultat de l'effet de ce coup joué en réponse. Maintenant comment un joueur peut-être averti que l'autre joueur a fait un coup, et donc recevoir les informations qui correspondent au changement d'état de la partie, ainsi que le signal qui l'informe que c'est à lui de joueur.

    3 solutions pour ça :
    • le polling : le client demande à intervalle régulier si l'état à changer depuis la dernière fois qu'il a demandé. Le serveur lui répond "non", ou "oui, et voilà ce qui'l s'est passé"
    • le client fait une demande de changement d'état, mais le serveur ne lui répond pas immédiatement, mais seulement quand l'état change. On gère juste un timeout pour que la demande ne reste pas sans réponse éternellement. Donc de temps à autre, le serveur peut répondre : "toujours aucun changement d'état", et le client, lorsqu'il reçoit cette réponse, redepose la question. Le client peut également gérer un timeout de son côté : si pas de réponse au bout d'un certain temps, la socket se ferme (timeoutexception) et le client repose la question. Cela permet également au client de savoir si le serveur est toujours présent et à l'écoute.
    • Gérer la communication dans les deux sens, mais c'est toujours problématique lorsqu'on est pas sur un reseau local (en particulier avec les proxies)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Merci joel.drigo de bien vouloir m'aider.

    J'ai essayé de mettre en place ce que tu m'as dit et j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at bataillenavale.Client.creerJoueur(Client.java:62)
    	at battleship.screen.ConnectPanel.actionPerformed(ConnectPanel.java:49)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    	at java.awt.EventQueue.access$500(Unknown Source)
    	at java.awt.EventQueue$3.run(Unknown Source)
    	at java.awt.EventQueue$3.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue$4.run(Unknown Source)
    	at java.awt.EventQueue$4.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    Je ne vois pas ou ça cloche :/
    Lorsque je clique sur l'erreur dans eclipse, il me renvoie sur out.println(demande).

    Voici mes différentes classes :

    Serveur.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    package bataillenavale;
     
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
     
    public class Serveur 
    {
    	private ArrayList<Games> listeJoueurs;
     
    	public Serveur() {
    		try {
    			// écoute du serveur
    			ServerSocket ss=new ServerSocket(1234);
    			System.out.println("Serveur en écoute...");
    			while(true) {
    				// un client se connecte
    				Socket socket=ss.accept();
    				System.out.println("Un client est connecté !");
    				new Thread(new threadServeur(this, socket)).start();
    			}
     
    		} catch (Exception e) {
    			System.err.println("Serveur : "+e.getMessage());
    		}
    	}
    	public static void main(String[] args) {
    		new Serveur();
    	}
    	public ArrayList<Games> getListeJoueurs() {
    		return listeJoueurs;
    	}
     
    	public Games getListeJoueurs(int i)
    	{
    		return listeJoueurs.get(i);
    	}
     
    	public void setListeJoueurs(ArrayList<Games> listeJoueurs) {
    		this.listeJoueurs = listeJoueurs;
    	}
     
    	public void addJoueurs (threadServeur ts, Player p1, threadServeur ts2, Player p2)
    	{
    		listeJoueurs.add(new Games(ts, p1, ts2, p2));
    	}
    }
    threadServeur.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    package bataillenavale;
     
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
     
    import org.json.JSONArray;
    import org.json.JSONObject;
    import org.json.JSONString;
     
    public class threadServeur implements Runnable
    {
    	private Socket socket;
    	private Serveur server;
     
    	public threadServeur (Serveur s, Socket ss)
    	{
    		server = s;
    		socket = ss;
    	}
     
    	@Override
    	public void run() 
    	{
    		// TODO Auto-generated method stub
    		try
    		{
    			PrintWriter out=new PrintWriter(socket.getOutputStream(), true);
    			BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
     
    			while(true)
    			{
    				JSONObject demande=new JSONObject(in.readLine());
    				if(demande.get("commande").equals("creerJeu"))
    				{
    					System.out.println("coucou test");
    					Player p = new Player(demande.getString("username").toString());
    					server.addJoueurs(this, p, null, null);		
    					JSONArray reponse = new JSONArray();
    					for (int i = 0; i < server.getListeJoueurs().size(); i++)
    					{
    						reponse.put(server.getListeJoueurs(i).toString());
    					}
    					out.println(reponse);
    				}
    			}
    		}
    		catch(Exception e)
    		{
     
    		}
    	}
    }
    Client.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    package bataillenavale;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.Scanner;
     
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import battleship.screen.Launcher;
     
     
    public class Client 
    {
    	private PrintWriter out;
    	private BufferedReader in;
    	private Launcher launch;
     
    	// Constructeur : instancie les flux de lecture et d'écriture après avoir ouvert le socket
    	public Client(boolean bool) 
    	{
    		if(bool)
    		{
    			try 
    			{
    				Socket socket=new Socket("localhost", 1234);
    				out = new PrintWriter(socket.getOutputStream(), true);
    				in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    				launch = new Launcher (true);
    			} catch (Exception e) {
    				System.err.println("Client : "+e.getMessage());;
    			}
    		}
     
    	}
     
    	public String[] creerJeu (String name) throws JSONException, IOException
    	{
    		JSONObject demande=new JSONObject();
    		demande.put("commande", "creerjeu");
    		demande.put("username", name);
    		out.println(demande);
    		JSONArray reponse = new JSONArray(in.readLine());
    		String[] rep = new String[reponse.length()];
    		for(int i = 0; i < reponse.length(); i++)
    		{
    			rep[i] = reponse.get(i).toString();
    		}
    		return rep;
    	}
     
    	public String[] creerJoueur (String name) throws JSONException, IOException
    	{
    		JSONObject demande = new JSONObject();
    		demande.put("commande", "creerJeu");
    		demande.put("username", name);
    		out.println(demande);
    		JSONArray reponse = new JSONArray(in.readLine());
    		String [] rep = new String[reponse.length()];
    		for(int i = 0; i<reponse.length(); i++)
    		{
    			rep[i] = reponse.get(i).toString();
    		}
    		return rep;
    	}
     
    	public void changePanelToLobby (Launcher launch)
    	{
    		launch.getFrame().getPanelDeConnection().setVisible(false);
    		launch.getFrame().getPanelDeLobby().setVisible(true);
    	}
    	public static void main(String[] args) throws JSONException, IOException 
    	{
    		Client client=new Client(true);
    		Scanner clavier=new Scanner(System.in);
     
    	}
    }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    A quoi sert le paramètre bool du constructeur de Client ? En tout cas, si ce paramètre est false, alors out n'est pas initialisé, et donc l'appel de creerJoueur(), (déclenché par une action sur un bouton — battleship.screen.ConnectPanel.actionPerformed) de Client cause une NullPointerException à la ligne 62, la où il y a out.println(demande);. Ce que dit exactement la stackTrace de l'exception. Je suppose que ta classe ConnectPanel pointe sur une instance de Client, créée en passant false au constructeur.

    Au niveau architecture, il faudrait plutôt faire qu'on affiche un ui d'accueil, avec un bouton de connexion qui créé une instance de client, non lié à toute notion de socket (au lieu de chercher à se connecter dans le constructeur). Lorsqu'on invoque ensuite l'envoi d'une commande, cet envoi réside en :
    • une connexion d'une socket vers le serveur
    • un envoi de la commande au format json
    • récupération du résultat en retour du serveur
    • fermeture de la socket
    • retour du résultat à l'appelant

    Ainsi, le client n'est connecté que lorsqu'il échange avec le serveur. Fais-toi une méthode qui envoi une commande sérialisée en json (la commande est une classe), que tu peux appeler ensuite dans toutes les méthodes d'envoi de commande au serveur.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    J'ai modifié en conséquence mes classes.
    Mon souci est lorsque je client sur le bouton connexion, mon code se bloque dans ma communication et je n'ai pas le changement de panel escompté.

    Pourrais-tu me dire ou mon code ne fonctionne pas stp ?

    Mon client.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package bataillenavale;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.Scanner;
     
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import battleship.screen.Launcher;
     
     
    public class Client 
    {
    	private Launcher launch;
     
    	// Constructeur : instancie les flux de lecture et d'écriture après avoir ouvert le socket
    	public Client() 
    	{
    		launch = new Launcher (true);
    	}
     
    	public static void main(String[] args) throws JSONException, IOException 
    	{
    		Client client = new Client();
    		Scanner clavier = new Scanner(System.in);
    	}
    }
    J'ai créé une classe de communication
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    package bataillenavale;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
     
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import battleship.screen.ConnectFrame;
    import battleship.screen.Launcher;
     
     
    public class Communication 
    {
    	private PrintWriter out;
    	private BufferedReader in;
     
    	public Communication ()
    	{
    		try 
    		{
    			Socket socket=new Socket("localhost", 1234);
    			out = new PrintWriter(socket.getOutputStream(), true);
    			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    		} catch (Exception e) {
    			System.err.println("Client : "+e.getMessage());;
    		}
    	}
     
    	public String[] creerJeu (String name) throws JSONException, IOException
    	{
    		JSONObject demande=new JSONObject();
    		demande.put("commande", "creerjeu");
    		demande.put("username", name);
    		out.println(demande);
    		JSONArray reponse = new JSONArray(in.readLine());
    		String[] rep = new String[reponse.length()];
    		for(int i = 0; i < reponse.length(); i++)
    		{
    			rep[i] = reponse.get(i).toString();
    		}
    		return rep;
    	}
     
    	public String[] creerJoueur (String name) throws JSONException, IOException
    	{
    		JSONObject demande = new JSONObject();
    		demande.put("commande", "creerJeu");
    		demande.put("username", name);
    		out.println(demande);
    		JSONArray reponse = new JSONArray(in.readLine());
    		String [] rep = new String[reponse.length()];
    		for(int i = 0; i<reponse.length(); i++)
    		{
    			rep[i] = reponse.get(i).toString();
    		}
    		return rep;
    	}
    }
    Voici les différentes classes dont je me sert pour l'affichage :
    ConnectFrame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    package battleship.screen;
     
    import javax.swing.JFrame;
     
    public class ConnectFrame extends JFrame
    {
    	private static ConnectPanel panelDeConnection;
    	private static LobbyPanel panelDeLobby;
     
    	public ConnectFrame ()
    	{		
    		panelDeConnection = new ConnectPanel();
    		panelDeLobby = new LobbyPanel();
    		setTitle("Battleship Connection");
    		setSize(900, 600);
    		add(panelDeConnection);		
    	}
    	public ConnectPanel getPanelDeConnection() {
    		return panelDeConnection;
    	}
    	public void setPanelDeConnection(ConnectPanel panelDeConnection) {
    		this.panelDeConnection = panelDeConnection;
    	}
    	public LobbyPanel getPanelDeLobby() {
    		return panelDeLobby;
    	}
    	public void setPanelDeLobby(LobbyPanel panelDeLobby) {
    		this.panelDeLobby = panelDeLobby;
    	}
     
     
    	public static void changePanelToLobby ()
    	{
    		System.out.println("coucou");
    		panelDeConnection.setVisible(false);
    		System.out.println("paneldeconnection désactivé");
    		panelDeLobby.setVisible(true);
    		System.out.println("panel de lobby activé");
    	}
     
     
    }
    ConnectPanel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    package battleship.screen;
     
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.IOException;
     
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    import org.json.JSONException;
     
    import bataillenavale.Client;
    import bataillenavale.Communication;
     
    public class ConnectPanel extends JPanel implements ActionListener
    {
    	private JLabel labelname;
    	private JTextField textfieldname;
    	private JButton buttonconnect;
     
    	public ConnectPanel ()
    	{
    		setLayout(new GridLayout(1, 3));
     
    		labelname = new JLabel("Votre username : ");
    		textfieldname = new JTextField();
    		buttonconnect = new JButton("Connection");
     
    		add(labelname);
    		add(textfieldname);
    		add(buttonconnect);
     
    		buttonconnect.addActionListener(this);
    		setVisible(true);
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent arg0) 
    	{
    		// TODO Auto-generated method stub
    		if(arg0.getSource() == buttonconnect)
    		{
    			Communication comm = new Communication();
    			try {
    				System.out.println(textfieldname.getText());
    				comm.creerJoueur(textfieldname.getText());
    			} catch (JSONException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			ConnectFrame.changePanelToLobby();
    		}
    	}
    }
    Launcher.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package battleship.screen;
     
    public class Launcher 
    {
    	private ConnectFrame frame;
     
    	public Launcher (boolean bool)
    	{
    		if(bool)
    		{
    			frame = new ConnectFrame();
    			frame.setVisible(true);
    		}
     
    	}
     
    	public ConnectFrame getFrame() {
    		return frame;
    	}
    	public void setFrame(ConnectFrame frame) {
    		this.frame = frame;
    	}
     
    	public static void main(String[] args) 
    	{
     
    	}
    }
    LobbyPanel.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package battleship.screen;
     
    import java.awt.GridLayout;
     
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
    public class LobbyPanel extends JPanel
    {
    	private JLabel jlusers;
     
    	public LobbyPanel ()
    	{
    		setLayout(new GridLayout(1,1));
    		jlusers = new JLabel("users connectés");
    		add(jlusers);
    		setVisible(false);
    	}
    }

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je dirais vite vu qu'il manque les fermetures des flux et de la socket.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    public class Communication implements AutoCloseable {
     
            private final Socket socket;
            private final PrintWriter out;
    	private final BufferedReader in;
     
    	public Communication () throws IOException {
    	    socket=new Socket("localhost", 1234);
    	    out = new PrintWriter(socket.getOutputStream(), true);
    	    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    	}
     
    	public String[] creerJeu (String name) throws JSONException, IOException {
    		JSONObject demande=new JSONObject();
    		demande.put("commande", "creerjeu");
    		demande.put("username", name);
    		out.println(demande);
    		JSONArray reponse = new JSONArray(in.readLine());
    		String[] rep = new String[reponse.length()];
    		for(int i = 0; i < reponse.length(); i++) {
    			rep[i] = reponse.get(i).toString();
    		}
    		return rep;
    	}
     
    	public String[] creerJoueur (String name) throws JSONException, IOException {
    		JSONObject demande = new JSONObject();
    		demande.put("commande", "creerJeu");
    		demande.put("username", name);
    		out.println(demande);
    		JSONArray reponse = new JSONArray(in.readLine());
    		String [] rep = new String[reponse.length()];
    		for(int i = 0; i<reponse.length(); i++) {
    			rep[i] = reponse.get(i).toString();
    		}
    		return rep;
    	}
     
            public void close() throws IOException {
                 if ( out!=null ) {
                      out.close();
                 }
                 if ( in!=null ) {
                      in.close();
                 }
                 if ( socket!=null ) {
                     socket.close();
                 }
            }
    }

    Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try (Communication comm = new Communication()) {
        System.out.println(textfieldname.getText());
        comm.creerJoueur(textfieldname.getText());
    } catch (JSONException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    (Le traitement des exceptions, c'est le minimum du minimum).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Bon finalement je suis reparti sur la base de ma communication client/serveur.

    Et bien évidemment j'ai un nouveau souci.
    J'ai une frame et lorsque je clique sur le bouton connect, j'envoie un JSONObject à mon threadServeur qui lui me créé un Player(String) puis l'ajoute à un ArrayList<Player> contenu dans mon serveur.

    Mon problème est que lorsque j'envoie mon JSONObject, il n'est pas reçu par mon threadServeur :/
    Je travaille en local.

    Voici mon code :

    Serveur.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    package bataille_navale;
     
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
     
    public class Serveur 
    {
    	private ArrayList<Player> listePlayer;
    	public Serveur() 
    	{
    		try 
    		{
    			// écoute du serveur
    			ServerSocket ss=new ServerSocket(1234);
    			System.out.println("Serveur en écoute...");
    			while(true) {
    				// un client se connecte
    				Socket socket=ss.accept();
    				System.out.println("Un client est connecté !");
    				new Thread(new ThreadServeur(socket, this)).start();
    			}
     
    		} catch (Exception e) {
    			System.err.println("Serveur : "+e.getMessage());
    		}
    	}
    	public static void main(String[] args) {
    		new Serveur();
    	}
     
    	public void AddPlayer (Player play)
    	{
    		System.out.println("coucou le player");
    		listePlayer.add(play);
    	}
     
    }
    Client.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    package bataille_navale;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
     
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import bataille_navale.ui.MaFrame;
     
    public class Client 
    {
    	private PrintWriter out;
    	private BufferedReader in;
     
    	public Client() 
    	{
    		try 
    		{
    			Socket socket=new Socket("localhost", 1234);
    			out = new PrintWriter(socket.getOutputStream(), true);
    			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    		} 
    		catch (Exception e) 
    		{
    			System.err.println("Client : "+e.getMessage());;
    		}
    	}
     
    	public String AddPlayerToServeur (Player play)
    	{
    		try
    		{
    			System.out.println("Entrée dans AddPlayer");
    			JSONObject demande = new JSONObject();
    			System.out.println("Create JSONObject");
    			demande.put("commande", "add");
    			System.out.println("Add Commande");
    			demande.put("param", play.getUsername());
    			System.out.println(demande.get("param"));
    			System.out.println(demande);
    			String result = in.readLine();
    			return result;
    		}
    		catch(Exception e)
    		{
    			System.out.println(e.getMessage());
    		}
    		return "";
    	}
     
    	public static void main(String[] args) throws JSONException, IOException 
    	{
    		Client client  = new Client ();
    		MaFrame frame = new MaFrame(client);
    		frame.setVisible(true);
    	}
    }
    ThreadServeur.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    package bataille_navale;
     
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
     
    import org.json.JSONObject;
     
    public class ThreadServeur implements Runnable
    {
    	private Socket socket;
    	private Serveur srv;
     
    	public ThreadServeur (Socket ss, Serveur serv)
    	{
    		socket = ss;
    		srv = serv;
    	}
    	@Override
    	public void run() 
    	{
    		// TODO Auto-generated method stub
    		try 
    		{
    			// flux d'écriture et de lecture
    			PrintWriter out=new PrintWriter(socket.getOutputStream(), true);
    			BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    			// boucle infinie
    			while(true)
    			{
    				System.out.println("in " + in.readLine());
    				JSONObject demande=new JSONObject(in.readLine());
    				System.out.println("demande thread : " + demande);
    				if(demande.get("commande").equals("add"))
    				{
    					Player play = new Player(demande.get("param").toString());
    					srv.AddPlayer(play);
    					out.println("ajoute");
    				}
    			}
    		}
    		catch(Exception e)
    		{
    			System.out.println(e.getMessage());
    		}
    	}
     
    }

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Hello,

    il y a pas mal de problèmes. Il va falloir procéder par ordre.

    Citation Envoyé par hannibal974 Voir le message
    Mon problème est que lorsque j'envoie mon JSONObject, il n'est pas reçu par mon threadServeur :/
    Et, c'est où, ça, que tu envoies ton JSONObject, exactement ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    J'appelle la méthode AddPlayerToServeur depuis un Jbutton et c'est cette méthode qui envoie mon JSONObject :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    package bataille_navale.ui;
     
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    import bataille_navale.Client;
    import bataille_navale.Player;
     
    public class PanelConnect extends JPanel implements ActionListener
    {
    	private JLabel labelname;
    	private JButton buttonconnect;
    	private JTextField textname;
    	private Client client;
     
    	public PanelConnect (Client cli)
    	{
    		client  = cli;
    		setLayout(new GridLayout(1, 3));
    		labelname = new JLabel("Entrez votre username");
    		buttonconnect = new JButton("Connect");
    		textname = new JTextField();
    		buttonconnect.addActionListener(this);
    		add(labelname);
    		add(textname);
    		add(buttonconnect);
    		setVisible(true);
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent e) 
    	{
    		// TODO Auto-generated method stub
    		if(e.getSource() == buttonconnect)
    		{
    			System.out.println(textname.getText());
    			Player play = new Player(textname.getText());
    			System.out.println(play.getUsername());
    			String validation = client.AddPlayerToServeur(play);
    			if(validation != "")
    			{
    				System.out.println("Ajout réussi");
    			}
    			else System.out.println("Ajout raté");
    		}
    	}
    }

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Citation Envoyé par hannibal974 Voir le message
    J'appelle la méthode AddPlayerToServeur depuis un Jbutton et c'est cette méthode qui envoie mon JSONObject :
    Ah. Et où est-ce que cette méthode envoie un JSONObject précisément ?
    Peux-tu nous montrer les lignes exactes qui font un envoi de JSONObject ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    La méthode présenté rapidement par mon professeur pour l'envoie du JSONObject est seulement de faire des put puis un out.println.

    Peut-être n'est-ce pas comme cela mais c'est la seule méthode que j'ai vu.

    En ce qui concerne la fonction qui envoie le jsonobject, je te laisse regarder ma classe Client et la méthode AddPlayerToServeur dans mon post précédent.

    Mon problème et sûrement con mais je suis bloqué là :/

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par hannibal974 Voir le message
    La méthode présenté rapidement par mon professeur pour l'envoie du JSONObject est seulement de faire des put puis un out.println.
    out.println() oui, mais toi tu fais des System.out.println(), qui affichent sur la console, donc rien à voir avec l'envoi vers le serveur. Pour envoyer au serveur, il faudrait peut-être écrire dans le outputStream de la socket, soit la variable out de la classe Client, ne penses-tu pas ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    J'avais pas fait la différence :/

    J'ai modifié mon code mais j'ai toujours un souci.

    Voici mon client.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    package bataille_navale;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
     
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import bataille_navale.ui.MaFrame;
     
    public class Client 
    {
    	private PrintWriter out;
    	private BufferedReader in;
     
    	public Client() 
    	{
    		try 
    		{
    			Socket socket=new Socket("localhost", 1234);
    			out = new PrintWriter(socket.getOutputStream(), true);
    			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    		} 
    		catch (Exception e) 
    		{
    			System.err.println("Client : "+e.getMessage());;
    		}
    	}
     
    	public String AddPlayerToServeur (Player play)
    	{
    		try
    		{
    			System.out.println("Entrée dans AddPlayer");
    			JSONObject demande = new JSONObject();
    			System.out.println("Create JSONObject");
    			demande.put("commande", "add");
    			System.out.println("Add Commande");
    			demande.put("param", play.getUsername());
    			System.out.println(demande.get("param"));
    			out.println(demande);
    			boolean result = in.readLine().equals("ajoute");
    			if(result)
    				return "ok";
    			else return "rate";
    		}
    		catch(Exception e)
    		{
    			System.out.println("error adding Player" + e.getMessage());
    		}
    		return "other";
    	}
     
    	public static void main(String[] args) throws JSONException, IOException 
    	{
    		Client client  = new Client ();
    		MaFrame frame = new MaFrame(client);
    		frame.setVisible(true);
    	}
    }
    Dans la console de mon client j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    toto
    toto
    Entrée dans AddPlayer
    Create JSONObject
    Add Commande
    toto
    error adding PlayerConnection reset
    validother
    et dans celui de mon serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Serveur en écoute...
    Un client est connecté !
    coucou adding
    null
    J'ai l'impression que mon erreur est un connect reset mais je n'en suis pas sur.

  14. #14
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Re,

    "coucou adding" ??

    Après "Un client est connecté !" la prochaine ligne attendue est System.out.println("in " + in.readLine()); et elle commence par "in", pas par "coucou". Ça ne va pas. Ce n'est pas le code que tu nous as montré.
    Nous ne pouvons pas deviner ce qui ne va pas avec un code imaginaire. Il faut montrer le code que tu utilises vraiment.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Désolé j'ai oublié de montrer la modif de mon threadServeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    package bataille_navale;
     
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
     
    import org.json.JSONObject;
     
    public class ThreadServeur implements Runnable
    {
    	private Socket socket;
    	private Serveur srv;
     
    	public ThreadServeur (Socket ss, Serveur serv)
    	{
    		socket = ss;
    		srv = serv;
    	}
    	@Override
    	public void run() 
    	{
    		// TODO Auto-generated method stub
    		try 
    		{
    			// flux d'écriture et de lecture
    			PrintWriter out=new PrintWriter(socket.getOutputStream(), true);
    			BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    			// boucle infinie
    			while(true)
    			{
    				JSONObject demande=new JSONObject(in.readLine());
     
    				if(demande.get("commande").equals("add"))
    				{
    					System.out.println("coucou adding");
    					Player play = new Player(demande.get("param").toString());
    					srv.AddPlayer(play);
    					out.println("ajoute");
    				}
    			}
    		}
    		catch(Exception e)
    		{
    			System.out.println(e.getMessage());
    		}
    	}
     
    }
    Ma console de mon client se bloque ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    toto
    toto
    Entrée dans AddPlayer
    Create JSONObject
    Add Commande
    toto
    le reste que j'ai montré avant se fiat lorsque je kill la fenêtre

  16. #16
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Je dirais vite vu qu'il manque les fermetures des flux et de la socket.
    Implicitement, comme indiqué dans ma réponse initiale (par try-with-resource). Ou explicitement par appel de close().
    Le serveur peut également envoyer un mot spécial reconnu par le client comme voulant dire "je n'ai plus rien à t'envoyer". ça fonctionne aussi du client vers le serveur.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Je ne vois pas vraiment ce que je dois faire :/
    Si je rajoute une méthode close à ma client pour fermer mon in et mon out, faut-il les appeler à la fin de mon if dans mon threadserveur ?

  18. #18
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    C'est bizarre quand même.

    Tu serais pas sur MacOS ou un autre système avec des fins de lignes bizarres ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Windows 8.1 ^^

  20. #20
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Bon bah j'ai copié tout ton code tel quel et inventé les classes qui manquent pour vérifier. Ouf -_-°.

    Les codes comme ça ne sont pas pratiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch(Exception e)
    {
      System.out.println(e.getMessage());
    }
    Il vaut mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch(Exception e)
    {
      e.printStackTrace();
    }
    Du coup ça donne quoi ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [C#] Client/serveur avec port série
    Par cyllix dans le forum Windows Forms
    Réponses: 13
    Dernier message: 21/08/2006, 10h56
  2. Réponses: 2
    Dernier message: 22/02/2006, 18h41
  3. Réponses: 1
    Dernier message: 01/02/2006, 18h48
  4. Client-serveur avec VB6 inside
    Par kremvax dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/11/2005, 14h08
  5. [SOCKET] connexion client serveur avec applet
    Par kaiser2003 dans le forum Applets
    Réponses: 2
    Dernier message: 06/10/2004, 23h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo