Partage
  • Partager sur Facebook
  • Partager sur Twitter

Difficulté d'utilisation de JFrame et des Sockets.

:-'(

    19 octobre 2016 à 22:54:40

    Bonjour à tous chers amis programmeurs,

    Alors voilà, je me suis lancé dans une petite application qui fonctionnerait de la manière suivante :

    Un serveur tout simple est lancé, le Client sous forme de JFrame se connecte sur le serveur et lorsque le client appui sur la flèche du haut ( VK_UP ) la variable " send " s'incrémente et elle est envoyée sur le Serveur en temps réel qui affiche les valeurs successivement incrémentées..

    Bref, rien de bien compliqué, A PRIORI mais... Lorsque je lance le client sans connexion au serveur, ma JFrame s'affiche belle et bien et lorsque j'appuie sur la touche du haut ( donc VK_UP ) ma variable s'incrémente bien ( donc en interne, j'ai mis un System.out.print en guise de témoin ) mais lorsque le serveur est lancé, le client arrive bel et bien à se connecter mais... la JFrame ne se lance pas... donc impossible de tester mon VK_UP avec l'envoi de la donnée send :-(

    Le code du serveur ( même si le problème ne vient absolument pas de là ) :

    import java.net.*;
    import java.io.*;
    
    public class Server {
    
    	public static void main(String[] args) {
    
    		try{
    
    		ServerSocket ss = new ServerSocket(1234);
    		
    		System.out.println("Attente d'un client...");
    		Socket s = ss.accept();
    
    		OutputStream os = s.getOutputStream();
    		InputStream is = s.getInputStream();
    
    		System.out.println("Client connecté.");
    		
    		while(true){
    		while ( s.isConnected() ){
    		int msg = is.read();
    		System.out.println(msg);
    		os.write(msg);
    		}
    	
    		if ( s.isClosed() ){
    		System.out.println("Terminé..");
    		}
    		}
    
    		}catch(IOException IOE){}
    
    	}
    
    }

    Le code du Client côté Main où je crée la fenêtre JFrame et où j'implémente dans le contentPane ma classe Connexion.

    import java.net.*;
    import java.util.Scanner;
    
    import javax.swing.JFrame;
    
    import java.io.*;
    
    public class Client {
    
    	public static void main(String[] args) {
    		
    		Connexion co = new Connexion();
    		
    		JFrame fen = new JFrame("Client");
    		
    		fen.setSize(600,400);
    		fen.setResizable(false);
    		fen.setDefaultCloseOperation(fen.EXIT_ON_CLOSE);
    		
    		fen.setContentPane(co);
    		fen.setVisible(true);
    
    	}
    
    }

    Et enfin, la classe Connexion à proprement parler :

    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    import javax.swing.JPanel;
    
    public class Connexion extends JPanel implements KeyListener, Runnable {
    	
    	int send = 0;
    	boolean envoi = false;
    	
    	public Connexion(){
    		this.addKeyListener(this);
    			this.setFocusable(true);
    				Thread Timer = new Thread(this);
    			Timer.start();
    		this.run();
    	}
    	
    	public void run() {
    		
    		try{
    			Thread.sleep(3);
    		}catch(InterruptedException IE) {}
    		
    		try{
    
    			Socket s = new Socket("localhost",1234);
    			
    			while (true){
    
    			OutputStream os = s.getOutputStream();
    			InputStream is = s.getInputStream();
    			
    				if (envoi){
    					os.write(send);
    				}
    					
    				int rep = is.read();
    				System.out.println(rep);
    			}
    			
    			}catch(IOException IOE) {}
    	}
    
    	public void keyPressed(KeyEvent e) {
    		if (e.getKeyCode() == KeyEvent.VK_UP){
    			send++;
    				System.out.println("Compteur interne : "+send);
    			envoi = true;
    		}
    	}
    
    	public void keyReleased(KeyEvent e) {
    		if (e.getKeyCode() == KeyEvent.VK_UP){
    			envoi = false;
    		}
    	}
    
    	public void keyTyped(KeyEvent e) {}
    	
    }



    Merci infiniment d'avance à toute la communauté dévouée d'OCR ! :-)

    • Partager sur Facebook
    • Partager sur Twitter
      20 octobre 2016 à 11:52:49

      Hello,

      Tu as essayé de créer ta connexion après la JFrame ? il se passe quoi ? Elle se fige ?

      • Partager sur Facebook
      • Partager sur Twitter

      Mon projet: SpotRoom. N'hésites pas à passer dire ce que tu en penses !

        20 octobre 2016 à 12:04:27

        Salut ! :)

        Je crois avoir localisé le problème : quand tu entre dans la boucle "while(true)" dans le fichier Connexion.java, ben... comme c'est une boucle infini, ça bloque. Du coup, tout ce qu'il y a après cette boucle (et donc après "Connexion co = new Connexion();"), ne s'exécute pas.

        • Partager sur Facebook
        • Partager sur Twitter
          20 octobre 2016 à 12:17:06

          Non normalement cette boucle est executée en Thread (donc en parallèle du reste). Je pense que ton thread est tout simplement mal déclaré (la flemme de regarder en détail ^^). 

          Edit: ok le problème viens du fait que tu te situe sur le thread graphique (avec le extends JPanel) du coup tu bloque tout. Fait une classe a part extends Thread (ou implement Runnable) et start la depuis ton JPanel (ou meme depuis le main). Ca marchera

          • Partager sur Facebook
          • Partager sur Twitter

          Mon projet: SpotRoom. N'hésites pas à passer dire ce que tu en penses !

            20 octobre 2016 à 17:53:08

            Merci à vous les gars !

            Arno21 > dès que j'ai terminé ma journée de dure labeur, je rentre chez moi et je saute sur mon PC essayer ça ! :-D encore merci ! 

            • Partager sur Facebook
            • Partager sur Twitter
              20 octobre 2016 à 18:49:47

              De rien, :) n'oublie pas de mettre le sujet en "Résolu" si ton problème l'est !
              • Partager sur Facebook
              • Partager sur Twitter
                20 octobre 2016 à 20:16:38

                Re-bonsoir,

                Il doit y avoir quelque chose qui m'échappe ( mais après tout, on apprend grâce aux erreurs ! ), j'ai tenté de créer une classe séparée dénommée "Test" que j'ai établi en tant que Thread dans ma classe JPanel appelée quant à elle, "Connexion".

                Lorsque je lance le Client, cette fois-ci la JFrame s'affiche et il se connecte bien au serveur ( le serveur me dit bien qu'un client vient de se connecter ), néanmoins, lorsque j'appuie sur ma touche VK_UP, le compteur témoin interne incrémente bien la variable send mais ça n'envoi toujours rien au serveur... :-(

                Voici ma classe Connexion désormais :

                import java.awt.event.KeyEvent;
                import java.awt.event.KeyListener;
                import java.io.IOException;
                import java.io.InputStream;
                import java.io.OutputStream;
                import java.net.Socket;
                
                import javax.swing.JPanel;
                
                public class Connexion extends JPanel {
                	
                	int send = 0;
                	boolean envoi = false;
                	
                	public Connexion(){
                		this.setFocusable(true);
                		this.addKeyListener(new Test());
                		Thread Execute = new Thread(new Test());
                		Execute.start();
                	}
                }

                Et ma classe "Test" : 


                import java.awt.event.KeyEvent;
                import java.awt.event.KeyListener;
                import java.io.IOException;
                import java.io.InputStream;
                import java.io.OutputStream;
                import java.net.Socket;
                
                public class Test implements Runnable, KeyListener {
                	
                	int send = 0;
                	boolean envoi = false;
                	
                	
                	public void run() {
                		
                		try{
                			
                			Socket s = new Socket("localhost",1234);
                			
                			while (true){
                
                			Thread.sleep(3);
                				
                			OutputStream os = s.getOutputStream();
                			InputStream is = s.getInputStream();
                			
                				if (envoi){
                					os.write(send);
                				}
                					
                				int rep = is.read();
                				System.out.println(rep);
                			}
                			
                			}catch(Exception E) {}
                
                	}
                	
                	public void keyPressed(KeyEvent e) {
                		if (e.getKeyCode() == KeyEvent.VK_UP){
                			send++;
                				System.out.println("Compteur interne : "+send);
                			envoi = true;
                		}
                	}
                
                	public void keyReleased(KeyEvent e) {
                		if (e.getKeyCode() == KeyEvent.VK_UP){
                			envoi = false;
                		}
                	}
                
                	public void keyTyped(KeyEvent e) {}
                	
                		
                	}
                

                J'ai pourtant bel et bien le pressentiment d'avoir commis une erreur bien GROSSIERE et ridicule..! Mais étant démuni de toute science infuse, je me tourne à nouveau vers vous..!

                Encore merci à mes deux interlocuteurs de tout à l'heure :-)

                -
                Edité par ManuBobo 20 octobre 2016 à 20:17:57

                • Partager sur Facebook
                • Partager sur Twitter
                  21 octobre 2016 à 10:03:35

                  Sachant que Test implements Runnable et que tu écris ça :

                  Thread Execute = new Thread(new Test());
                          Execute.start();

                  je te conseil d'aller refaire un petit tour sur la programmation concurrente en Java :D

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Mon projet: SpotRoom. N'hésites pas à passer dire ce que tu en penses !

                    21 octobre 2016 à 17:24:49

                    Salut Arno21, j'ai modifié en conséquence le code de ma classe Test en :

                    public class Test extends Thread implements KeyListener {
                    

                    Le problème reste le même, le client se connecte bel et bien sur le serveur, la JFrame côté Client se lance bien également et le témoin d'incrémentation de ma variable interne fonctionne mais... une fois de plus, le serveur ne reçoit aucune donnée et n'en renvoi aucune au Client.. :-(

                    En observant un peu le comportement de mon code, j'ai remarqué que tout ce qui se passait entre while (true){ } de ma classe Test ne s'exécutait pas car j'ai mis un System.out.println("Hey!"); à chaque fois que mon message est censé être envoyé au serveur et ce message ne s'affiche même pas dans la console de mon client !

                    if (envoi){
                    os.write(send);
                    System.out.println("Hey!");
                    }



                    EDIT : Je confirme bel et bien qu'il s'agit d'un problème avec mon KeyListener car quand tout de suite après ma boucle while(true){ je mets "os.write(1)" mon serveur reçoit une avalanche de 1 qu'il renvoi aussitôt au client ! Donc c'est un problème de gestion de KeyListener.. Je n'arrive toujours pas, à l'heure actuelle, à solder ce problème hélas.. :-(

                    Si je mets par contre :

                    if (envoi=true){
                    send++;
                    os.write(send);
                    System.out.println("Hey!");
                    }

                    au lieu de if (envoi){ tout court, ça envoi en boucle la variable send qui s'incrémente toute seule au serveur et VK_UP ne sert à rien du tout, tout s'enchaine à fond ( envoi / réception ) par milliers de chiffres sans que je puisse faire quoi que ce soit !

                    -
                    Edité par ManuBobo 21 octobre 2016 à 17:58:22

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Difficulté d'utilisation de JFrame et des Sockets.

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown