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 :

N’exécute pas les programmes en même temps


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 32
    Points
    32
    Par défaut N’exécute pas les programmes en même temps
    Bonjour,

    Je suis en train de faire un programme composé d'un serveur et de plusieurs client, à la connexion d'un client on demande de taper un pseudo. Cependant quand je lance plusieurs client, le programme se concentre seulement sur un seul client alors que j'utilise les threads.
    je vous met une partie des programmes de la partie serveur et client pour que vous puissiez regarder ce qu'il ne va pas.

    coté serveur
    serveur
    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
    public class Serveur {
    	public static final Statement Null = null;
    	public static Thread t;
    	public static ServerSocket ss = null;
    	public static Statement state1 = Null;
    	public  PrintWriter out;
     
    	public static void main(String[] args) throws IOException, SQLException, InterruptedException{
    		 state1 = SQL.sql("quizz");
    		 ss = Communication.initconnexion();
    	     t = new Thread( new Connexion(ss, state1));
    	     t.start();
    	     //Communication.quitter();	       
    	}	
    }
    connexion
    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
    public class Connexion implements Runnable {
    	public static ServerSocket socketserver = null;
    	public static Socket socketduserveur = null;
    	public static BufferedReader in = null ;
    	public static PrintWriter out;
    	public static Statement state2;
    	public Thread t1;
     
    	public Connexion(ServerSocket ss, Statement state) {
    		socketserver = ss;
    		state2 = state;
    	}
     
    	public void run() {
    		  try {
    			  while(true){
    		  socketduserveur = socketserver.accept();
    		  in = new BufferedReader(new InputStreamReader(socketduserveur.getInputStream()));
    		  out = new PrintWriter(socketduserveur.getOutputStream());
    		  out.println("Veuillez choisir un pseudo: ");
    		  out.flush();
    		  System.out.println(in.readLine());
    		  out.println("Vous etes connecte");
    		  out.flush();
    		  t1 = new Thread ( new Questionnaire("quizz", state2));
    		  t1.start();
    			  }
    		  }catch (IOException e) {
    				e.printStackTrace();
    			} 
    	}
    }
    coté client
    client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Client {
    	public static void main(String[] zero) throws IOException {
     
    		Scanner sc = new Scanner(System.in);
    		String b = "" ;
    		int a =0;
    		int c =0;
    		int rep;
    		Thread t; 
     
    		t = new Thread( new Connexion());		    
    		t.start();
    connexion
    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
    public class Connexion implements Runnable {
    	static Socket socket;
    	static BufferedReader in;
    	static PrintWriter out =null;
    	Scanner sc = new Scanner(System.in);
    	static String pseudo;
    	public void run() {
     
    		    try {
    				socket = new Socket("192.168.137.1",2009);	 
    				in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
    				out = new PrintWriter(socket.getOutputStream());
    		        System.out.println(in.readLine());
    		        pseudo = sc.nextLine();
    		        Connexion.out.println(pseudo + " est connecte");
    		        Connexion.out.flush();
    		    	}catch (UnknownHostException e) {
    		    		e.printStackTrace();
    		    	} catch (IOException e) {
    		    		e.printStackTrace();
    		    	}	        
    			}
     
    }

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Si tu veux que le serveur soit disponible juste après avoir accepté un client, tu dois continuer dans un thread tout ce qui se passe après accept(), bien sûr -_-°.
    Tu pensais que du moment que tu mettais Thread n'importe où ça allait forcément faire un truc qui t'arrange ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 32
    Points
    32
    Par défaut
    Je ne comprend ce qui est apres accept() est dans un Thread non ?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Bah... Tout est toujours dans un thread. Mais l'idée c'est que ce qui se passe après accept() soit dans un nouveau thread et pas dans le même thread que accept().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 32
    Points
    32
    Par défaut
    ok je pense avoir compris, à chaque interventon du serveur je dois faire un nouveau Thread ? Mais ça va faire beaucoup de threads et donc beaucoup de classes

  6. #6
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Sans avoir lu ton code dans le détail, je remarque que les variables de la classe Connexion sont statiques. Jettes un oeil du coté d'un cours java pour comprendre ce que veut dire static. Ca expliquerait pourquoi tu n'arrives à gérer qu'un client...

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par thejavator Voir le message
    ok je pense avoir compris, à chaque interventon du serveur je dois faire un nouveau Thread ?
    À chaque arrivée d'un nouveau client, c'est à dire immédiatement après chaque accept().

    Citation Envoyé par thejavator Voir le message
    Mais ça va faire beaucoup de threads
    Autant que de clients, ce qui peut faire beaucoup, oui. Si c'est vraiment un problème, il y a moyen de limiter le nombre de threads en utilisant un ThreadPoolExecutor. Mais ça devient compliqué, c'est pas comme ça qu'on apprend.

    Citation Envoyé par thejavator Voir le message
    et donc beaucoup de classes
    Bah non... Tous les clients sont traités pareil, donc le thread exécute toujours la même classe. Ça fait une seule classe, et pas mal d'objets de cette classe.

    @hwoarang> ah oui, ça aussi il faut.
    Mais les threads restent indispensables pour gérer plus d'un client à la fois.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 32
    Points
    32
    Par défaut
    Apres que le client soit connecté, le serveur envoie une question avec des réponses différentes et le client doit donc répondre et i a plusieurs questions à répondre. Il faut donc que je fasse plusieurs threads encore non ? Par exemple un thread pour envoyer la question, un autre pour le client réponde ?

    je vous met le code intégral pour que vous puissiez voir ce qu'il ne va pas

    coté serveur
    serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Serveur {
    	public static Thread t;
     
    	public static void main(String[] args) throws IOException, SQLException, InterruptedException{
    		 SQL.sql("quizz");
    		 Communication.initconnexion();
    		 t = new Thread( new Connexion());
    	     t.start();
    	     //Communication.quitter();	       
    	}	
    }
    SQL
    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
    public class SQL extends Communication {
     
    	public static final Statement Null = null;
    	public static Statement state = Null;
    	public static ResultSet result = (ResultSet) Null;
     
    		public static void sql(String table){
    			 try {
     
    			      Class.forName("com.mysql.jdbc.Driver");
    			      System.out.println("Driver O.K.");
    			      String url = "jdbc:mysql://localhost:3306/mydb";
    			      String user = "root";
    			      String passwd = "louis";
    			      Connection conn = DriverManager.getConnection(url, user, passwd);
    			      System.out.println("Connecté à la base de données"); 
    			      state = conn.createStatement();
    			      result = state.executeQuery("SELECT * FROM " +table);					
    			      System.out.println("Questionnaire "+table+" sélectionné");
    			 }
    			 catch (Exception e) {
    			      e.printStackTrace();
    			      System.out.println("erreur 1");
    			    }
     
    		}
    }
    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
    public class Communication extends Serveur {
    	static ServerSocket socketserver;
    	static Socket socketduserveur ;
     
     
     
    	public static void initconnexion() throws IOException{
    		  socketserver = new ServerSocket(2009);
    	      InetAddress address = InetAddress.getLocalHost();
    	      String hostIP = address.getHostAddress() ;
    		  String hostName = address.getHostName();
    		  System.out.println("Le nom de serveur est : " + hostName + "\nIP: " + hostIP);
    		  System.out.println("Le serveur est à l'écoute du port "+socketserver.getLocalPort());
     
    	}
     
    	public static void quitter() throws IOException{
    		Connexion.out.println("Quitter");
    		Connexion.out.flush(); 
    	    socketduserveur.close();
    	    socketserver.close();
    	}
    }
    Connexion
    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
    public class Connexion implements Runnable {
     
    	public static BufferedReader in = null ;
    	public static PrintWriter out;
    	public Thread t1;
     
    	public Connexion() {
     
    	}
     
    	public void run() {
    		  try {
    			  while(true){
    		  Communication.socketduserveur = Communication.socketserver.accept();
    		  in = new BufferedReader(new InputStreamReader(Communication.socketduserveur.getInputStream()));
    		  out = new PrintWriter(Communication.socketduserveur.getOutputStream());
    		  t1 = new Thread ( new Questions());
    		  t1.start();
    			  }
    		  }catch (IOException e) {
    				e.printStackTrace();
    			} 
    	}
    }
    Questions
    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
    public class Questions implements Runnable {
     
    	public synchronized void run() {
    		@SuppressWarnings("unused")
    		int rep, rep1;
    		int b;
    		int a = 0;
    		try{
    		Connexion.out.println("Veuillez choisir un pseudo: ");
    		  Connexion.out.flush();
    		  System.out.println(Connexion.in.readLine());		
    		  Connexion.out.println("Vous etes connecte");
    		  Connexion.out.flush();
    		 Connexion.out.println(" ");
    		 Connexion.out.flush();
    		 Connexion.out.println("Questions:");
    		 Connexion.out.flush();
    		 Connexion.out.println(" ");
    		 Connexion.out.flush();
    		 Connexion.out.println(" ");
    		 Connexion.out.flush();
     
    			while(SQL.result.next()){         
    				    Thread.sleep(1000);	
    				    Connexion.out.print(SQL.result.getInt("id")+")");
    				    Connexion.out.flush();
    				    Connexion.out.print(SQL.result.getString("question"));
    				    Connexion.out.println(" ");
    				    Connexion.out.flush();
    				    Connexion.out.flush();
    			        for(int i = 3; i <= 6; i++){  
    			        	Connexion.out.print("     " + (i-2) +"- " + SQL.result.getString(i));
    			        	Connexion.out.println(" ");
    			        	Connexion.out.flush();
     
    			        }
    			        Connexion. out.println(" ");
    			        Connexion.out.flush();
    			        Connexion. out.println("Veuillez saisir votre reponse:");
    			        Connexion.out.flush();
    			        rep = Connexion.in.read();
    			        rep1 = Connexion.in.read();
    			        Connexion.out.flush();
    			        b = Character.getNumericValue(rep);
    			        if(b == SQL.result.getInt("corrige")){
    			        	Connexion.out.println("Bonne reponse");
    			        	Connexion.out.flush();   	
    			        	System.out.println(Connexion.in.readLine());
    			        	a++;
    			        }
    			        else{
    			        	Connexion.out.println("Mauvaise reponse");
    			        	Connexion.out.flush();
    			        	Connexion.out.println("La bonne reponse etait "+SQL.result.getString((SQL.result.getInt("corrige")+2)));
    			        	Connexion.out.flush();
    			        	System.out.println(Connexion.in.readLine());
    			        }
    			        Connexion.out.println("Votre score est de "+ a +"/"+SQL.result.getInt("id")+".");
    			        Connexion.out.flush();
    			        Connexion.out.println(" ");
    			        Connexion.out.flush();
    			        Thread.sleep(1000);
    			  }
    		} catch (SQLException | InterruptedException | IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
     
     
    }
    coté client
    Client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Client {
    	public static void main(String[] zero) throws IOException {
     
     
    		Thread t; 
     
    		t = new Thread( new Connexion());		    
    		t.start();
    }
    }
    Connexion
    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
    public class Connexion implements Runnable {
    	static Socket socket;
    	static BufferedReader in;
    	static PrintWriter out =null;
    	Scanner sc = new Scanner(System.in);
    	static String pseudo;
    	String b = "" ;
    	int a =0;
    	int c =0;
    	int rep;
    	public void run() {
     
    		    try {
     
    				socket = new Socket("192.168.137.1",2009);	 
    				in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
    				out = new PrintWriter(socket.getOutputStream());
    		        System.out.println(in.readLine());
    		        pseudo = sc.nextLine();
    		        Connexion.out.println(pseudo + " est connecte");
    		        Connexion.out.flush();
    		        b=in.readLine();   
    		        do{
    		        	if(!"Veuillez saisir votre reponse:".equals(b)){
    		        		System.out.println(b);
    		        	}
    		        	else{
    		        		System.out.println(b);
    	        			rep = sc.nextInt();
    	        			out.println(rep);
    	        			out.flush();
    	        			c++;
    		        		}
    			        	if(b.equals("Bonne reponse")){
    		        			a++;			        			
    		        			out.println(pseudo+" a bien repondu, son score est de "+a+"/"+c);
    		        			out.flush();
    		        		}
    		        		else{
    		        			if(b.equals("Mauvaise reponse")){
    		        			out.println(pseudo+" n'a pas bien repondu, son score est de "+a+"/"+c);
    		        			out.flush();
    		        			System.out.println(in.readLine());
    		        			}
    		        		}
    		        	b=in.readLine();
    		       }
    		        while(!"Quitter".equals(b));	
    		        out.flush();
    		        socket.close();
    		}
    		catch (UnknownHostException e) {	
    			e.printStackTrace();
    		}
    		catch (IOException e) {
    			e.printStackTrace();		
    	}	
    }
     
    }
    il y a beaucoup de code mais une partie est pour le sql et la classe Questions qui gère l'envoie des questions,la réponse et le score.

    Quand je le lance avec un seul client, le programme fonctionne correctement mais quand met un deuxième il ne va plus dut tout. Il continue avec le premier utilisateur mais l'envoie des questions ne marche pas bien il envoie en double( peut être parce qu'il pense l'envoyer à l'autre client)

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    un thread par client, pourquoi tu veux faire plus?

  10. #10
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    un thread par client, pourquoi tu veux faire plus?
    tu veut dire alors un seul thread dans tout le programme ?
    c'est ce que j'avais fait au début mais ne marchait pas trop, peut etre que j' l'ai mal fait

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Non, il veut dire si tu as 4 clients, 4 threads. Si tu as 17 clients, 17 threads. Il a dit un thread par client et ça voulait dire un thread par client.

    Si tu dis que tu as déjà essayé des trucs avant et que ça marchait pas, montre-les-nous.

    Concernant ce qui ne va pas dans ton code, on t'en a déjà dit deux :
    - tu as plein de trucs static qui ne doivent pas être static, ça ne peut pas marcher.
    - il faut démarrer un nouveau thread à chaque fois que tu acceptes un nouveau client, dès que tu acceptes un nouveau client.

    Essaie, un peu. Arrête de discuter et fais de temps en temps ce que te disent les gens.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par thelvin Voir le message
    - tu as plein de trucs static qui ne doivent pas être static, ça ne peut pas marcher.
    j'ai supprimer quelques trucs static notament dans la partie connexion mais certains ne peuvent être retiré ils sont utilisés dans d'autres classes.

    Citation Envoyé par thelvin Voir le message
    - il faut démarrer un nouveau thread à chaque fois que tu acceptes un nouveau client, dès que tu acceptes un nouveau client.
    C'est ce que j'ai fait non ?
    Citation Envoyé par thelvin Voir le message
    Essaie, un peu. Arrête de discuter et fais de temps en temps ce que te disent les gens.
    j'essaie des trucs mais je n'arrive pas, je fais des choses avant de poster mais sans succès.

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par thejavator Voir le message
    j'ai supprimer quelques trucs static notament dans la partie connexion mais certains ne peuvent être retiré ils sont utilisés dans d'autres classes.
    Ce n'est pas une excuse. static veux dire "une seule valeur pour tout le programme", pas "accessible par d'autres classe". L'accessibilité en dehors de la classe, c'est régit par les mots clés public/private/protected. A par le void main, rien ne devrait être statique avec ton code.

  14. #14
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par thejavator Voir le message
    Citation Envoyé par thelvin
    - il faut démarrer un nouveau thread à chaque fois que tu acceptes un nouveau client, dès que tu acceptes un nouveau client.
    C'est ce que j'ai fait non ?
    Aeuuuuuuh... Oui, en effet, je dis une bêtise, j'ai pas vu la différence avec le précédent essai.
    Enfin, il y a quand même deux lignes entre le accept() et la création du Thread. Ce serait plus clair qu'il n'y en ait pas. Là comme ça ça marche, mais ça induit en erreur.

    Si t'as du nouveau code sans static dans les threads, montre-nous.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Comme te l'ont fait remarquer certains (dont moi), il faut supprimer tes variables static. Les problemes que tu rencontres viennent de la.

    Citation Envoyé par thejavator Voir le message
    j'ai supprimer quelques trucs static notament dans la partie connexion mais certains ne peuvent être retiré ils sont utilisés dans d'autres classes.
    Quand je lis ca, je pense automatiquement "probleme d'architecture". Ca sent le truc bidouillé ou tu vas taper directement dans des objets ou tu ne devrais pas dans un contexte multi-thread. Bref, c'est pas comme ca qu'il faut faire.

    Concernant ton probleme, voila le déroulement (qui montre que c'est bien static qui fait que ca marche pas) :
    - La variable Connexion.out est static et initialisée lorsqu'un nouveau client se connecte. Elle contient donc un OutputStream vers le dernier client connecté.
    - Dans le thread Questions, tu utilises pour tous les clients Connexion.out. C'est donc le dernier thread qui recoit tout (aux erreurs de multi-thread pres).

    Bref, pour corriger à court terme :
    - Passer à la classe Questions la Socket issue de accept et récupérer dans celle-ci les InputStream/OutputStream. Ca aura également l'avantage de mieux centraliser la gestion d'un client plutot que d'en mettre un peu partout.
    - A l'évidence, tu ne comprends pas ce qu'est une variable static. La lecture d'un petit cours java ne ferait pas de mal. Il y en a beaucoup sur le net. Et pour simplifier, n'utilise pas de variable static.

  16. #16
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 32
    Points
    32
    Par défaut
    j'avais supprimer des sockets qui était en static, ça me semblait normal de les retirer. j'ai mis les variables in et out qui étaient static dans la classe questions et grâce à ça ça fonctionne merci

    Mais maintenant j'ai un autre problème:
    quand le serveur lance la première question au premier client connecté, le deuxième client reçoit la deuxième questions ensuite le premier client la troisième et ainsi de suite.
    Mes questions sont stockés dans une base de données, apparemment le serveur ne prend les questions depuis le début quand un nouveau client se connecte. Pourtant je pense avoir fait ce qu'il fallait, j'ai donc créer un nouveau Thread dans la classe SQL qui me permet d'avoir une variable result pour chaque client.
    Quand je lance le programme, le client à sa première questions et quand vient l'envoie de la première question au client suivant on m'indique une erreur "Operation not allowed after ResultSet closed" concernant la ligne de la classe Questions.
    Je ne comprend pas trop cette erreur, je vois pas pourquoi le resulSet a été fermé ?

    je vous met le code intégral
    coté serveur
    Serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Serveur {
    	public static Thread t;
    	public static String table;
     
    	public static void main(String[] args) throws IOException, SQLException, InterruptedException{
    		 table = "quizz";
    		 SQL.sql();
    		 Communication.initconnexion();
    		 System.out.println("Questionnaire "+table+" sélectionné");	
    		 t = new Thread( new Connexion());
    		 t.start();           
    	}	
    }
    Communication
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Communication extends Serveur {
    	static ServerSocket socketserver;
    	static Socket socketduserveur ;
     
    	public static void initconnexion() throws IOException{
    		  socketserver = new ServerSocket(2009);
    	      InetAddress address = InetAddress.getLocalHost();
    	      String hostIP = address.getHostAddress() ;
    		  String hostName = address.getHostName();
    		  System.out.println("Le nom de serveur est : " + hostName + "\nIP: " + hostIP);
    		  System.out.println("Le serveur est à l'écoute du port "+socketserver.getLocalPort());	      
    	}
    }
    Connexion
    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
    public class Connexion implements Runnable {
    	Thread t2;	
     
    	public void run() {
     
    		  try {
    			  while(true){
    		  Communication.socketduserveur = Communication.socketserver.accept();
    		  t2 = new Thread ( new SQL());
    		  t2.start();  
    			  }
    		  }catch (IOException e) {
    				e.printStackTrace();
    			} 
    	}
    }
    SQL
    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
    public class SQL extends Communication implements Runnable {
     
    	static Statement Null = null;
    	static Statement state = Null;
     
    	Thread t1;
     
    		public static void sql(){
    			 try {
     
    			      Class.forName("com.mysql.jdbc.Driver");
    			      System.out.println("Driver O.K.");
    			      String url = "jdbc:mysql://localhost:3306/mydb";
    			      String user = "root";
    			      String passwd = "louis";
    			      Connection conn = DriverManager.getConnection(url, user, passwd);
    			      System.out.println("Connecté à la base de données"); 
    			      state = conn.createStatement();
     
    			 }
    			 catch (Exception e) {
    			      e.printStackTrace();
    			      System.out.println("erreur 1");
    			    }
     
     
    		}
     
    		public void run() {
    			try {
    				ResultSet result = state.executeQuery("SELECT * FROM " +table); 
    				t1 = new Thread( new Questions(result));
    				t1.start();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
     
    		}
    }
    Questions
    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
    public class Questions implements Runnable {
    	ResultSet result3;
    		public Questions(ResultSet result1){
    			result3= result1;
    		}
    	public synchronized void run() {
    		@SuppressWarnings("unused")
    		int rep, rep1;
    		int b;
    		int a = 0;
    		BufferedReader in = null ;
    		PrintWriter out;
    		try{
    			in = new BufferedReader(new InputStreamReader(Communication.socketduserveur.getInputStream()));
    			out = new PrintWriter(Communication.socketduserveur.getOutputStream());
    		    out.println("Veuillez choisir un pseudo: ");
    		    out.flush();
    		    System.out.println(in.readLine());		
    		    out.println("Vous etes connecte");
    		    out.flush();
    		    out.println(" ");
    		 	out.flush();
    		 	out.println("Questions:");
    		 	out.flush();
    			out.println(" ");
    		 	out.flush();
    		 	out.println(" ");
    			out.flush();
     
    			while(result3.next()){         
    				    Thread.sleep(1000);	
    				    	out.print(result3.getInt("id")+")");
    				    	out.flush();
    				    	out.print(result3.getString("question"));
    				    	out.println(" ");
    				    	out.flush();
    				    	out.flush();
    			        for(int i = 3; i <= 6; i++){  
    			        		out.print("     " + (i-2) +"- " + result3.getString(i));
    			        		out.println(" ");
    			        		out.flush();	
    			        }
    			        	out.println(" ");
    			        	out.flush();
    			        	out.println("Veuillez saisir votre reponse:");
    			        	out.flush();
    			        	rep = in.read();
    			        	rep1 =	in.read();
    			        	out.flush();
    			        b = Character.getNumericValue(rep);
    			        if(b == result3.getInt("corrige")){
    			        		out.println("Bonne reponse");
    			        		out.flush();   	
    			        	System.out.println(	in.readLine());
    			        	a++;
    			        }
    			        else{
    			        		out.println("Mauvaise reponse");
    			        		out.flush();
    			        		out.println("La bonne reponse etait "+result3.getString((result3.getInt("corrige")+2)));
    			        		out.flush();
    			        		System.out.println(	in.readLine());
    			        }
    			        	out.println("Votre score est de "+ a +"/"+result3.getInt("id")+".");
    			        	out.flush();
    			        	out.println(" ");
    			        	out.flush();
    			        Thread.sleep(1000);
    			  }
    				out.println("Quitter");
    				out.flush(); 
    				//Communication.socketduserveur.close();
    				//Communication.socketserver.close();
    		} catch (SQLException | InterruptedException | IOException e) {
    			e.printStackTrace();
    		}
    	}
     
     
    }
    coté client
    Client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Client {
    	public static void main(String[] zero) throws IOException {
     
    		Thread t; 
     
    		t = new Thread( new Connexion());		    
    		t.start();			
    	}
    }
    Connexion
    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
    public class Connexion implements Runnable {
    	Socket socket;
    	BufferedReader in;
    	PrintWriter out =null;
    	Scanner sc = new Scanner(System.in);
    	String pseudo;
    	String b = "" ;
    	int a =0;
    	int c =0;
    	int rep;
    	public void run() {
     
    		    try {
     
    				socket = new Socket("192.168.137.1",2009);	 
    				in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
    				out = new PrintWriter(socket.getOutputStream());
    		        System.out.println(in.readLine());
    		        pseudo = sc.nextLine();
    		        out.println(pseudo + " est connecte");
    		        out.flush();
    		        b=in.readLine();   
    		        do{
    		        	if(!"Veuillez saisir votre reponse:".equals(b)){
    		        		System.out.println(b);
    		        	}
    		        	else{
    		        		System.out.println(b);
    	        			rep = sc.nextInt();
    	        			out.println(rep);
    	        			out.flush();
    	        			c++;
    		        		}
    			        	if(b.equals("Bonne reponse")){
    		        			a++;			        			
    		        			out.println(pseudo+" a bien repondu, son score est de "+a+"/"+c);
    		        			out.flush();
    		        		}
    		        		else{
    		        			if(b.equals("Mauvaise reponse")){
    		        				out.println(pseudo+" n'a pas bien repondu, son score est de "+a+"/"+c);
    		        				out.flush();
    		        				System.out.println(in.readLine());
    		        			}
    		        		}
    		        	b=in.readLine();
    		       }
    		        while(!"Quitter".equals(b));	
    		        out.flush();
    		        socket.close();
     
    		    	}catch (UnknownHostException e) {
    		    		e.printStackTrace();
    		    	} catch (IOException e) {
    		    		e.printStackTrace();
    		    	}	        
    			}
     
    }
    je sais pas si je suis dans la bonne partie du forum, je devrais peut être mettre ça dans la partie SGBD.

  17. #17
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par thejavator Voir le message
    Mais maintenant j'ai un autre problème:
    quand le serveur lance la première question au premier client connecté, le deuxième client reçoit la deuxième questions ensuite le premier client la troisième et ainsi de suite.[/CODE]

    je sais pas si je suis dans la bonne partie du forum, je devrais peut être mettre ça dans la partie SGBD.
    Sans regarder ton code, je parie que tu utilises le meme resultset pour tous tes clients. Il faut executer la requete pour chacun ou bien stocker quelque part le resultat de celle-ci.

  18. #18
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 32
    Points
    32
    Par défaut
    oui ça c'était au début, après j'ai expliqué pour régler ce problème que j'avais fait thread qui me permet d'avoir une variable result pour chaque client.
    mais j'ai une autre erreur que j'ai mis sur le post du dessus

  19. #19
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Je remarque que tu n'as pas posté le code ou tu crées des objets Questions. Je vois aussi que tu passes un resultset à la question. Et je parie que quand tu posteras ton code, ce sera le meme resultset qui sera passé à tous tes objets Questions.

  20. #20
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 32
    Points
    32
    Par défaut
    oui en effet j'ai oublié la classe SQL qui es assez importantes pour cette situation, je viens de mettre à jour.
    Justement je ne pense pas que ça soit le même resultset la.
    Je pense plutôt que c'est un problème avec la BD et non threads maintenant.

Discussions similaires

  1. lancer 16 programmes en même temps
    Par piotr dans le forum Langage
    Réponses: 9
    Dernier message: 23/03/2007, 16h31
  2. Grant sur toutes les tables en même temps
    Par jer64 dans le forum SQL
    Réponses: 3
    Dernier message: 25/09/2006, 07h59
  3. Réponses: 5
    Dernier message: 03/08/2006, 16h13
  4. Réponses: 3
    Dernier message: 23/03/2006, 17h59

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