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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 : 56
    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
    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 confirmé
    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
    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 : 56
    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
    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 confirmé
    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
    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 : 56
    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
    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.

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, 09h56
  2. Réponses: 2
    Dernier message: 22/02/2006, 17h41
  3. Réponses: 1
    Dernier message: 01/02/2006, 17h48
  4. Client-serveur avec VB6 inside
    Par kremvax dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/11/2005, 13h08
  5. [SOCKET] connexion client serveur avec applet
    Par kaiser2003 dans le forum Applets
    Réponses: 2
    Dernier message: 06/10/2004, 22h32

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