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

Entrée/Sortie Java Discussion :

bloquage d'un client de chat (socket et thread)


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 57
    Par défaut bloquage d'un client de chat (socket et thread)
    salut, je develope un petit chat client serveur en java, dans ce chat le client dés qu'il se connecte il récupere la liste des utilisateurs connectés de puis le serveur et remplie une jlist avec la liste, le probleme c'est que le client se bloque apres qu'il consulte le serveur, voila le code client et serveur, et merci pour l'aide.

    si vous avez des idées pour faire cela autrement, elles sont lesbienvenue.

    code 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    Thread threadlistpseudo=new Thread()
                        {
                            public PrintWriter out=null;
                            public BufferedReader in=null;
                            public ServerSocket sEcoute=null;
                            public Socket sService=null;
     
                            public void run()
                            {
                                ////////repondre a la requete du client pour lui communiquer la liste des pseudo
                                try{
                                        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                                        con = DriverManager.getConnection(url);
                                        stm = con.createStatement();
                                        sEcoute =new ServerSocket(3500);
                                        sService=sEcoute.accept();
                                        out=new PrintWriter(sService.getOutputStream(),true);
                                        in=new BufferedReader(new InputStreamReader(sService.getInputStream()));
     
                                        String query=in.readLine();
                                        rst=stm.executeQuery(query);
     
                                        while(rst.next())
                                        {
                                            out.write(rst.getString(1)+ "\r\n");
                                            out.flush();
                                        }
                                        out.flush();
                                        sEcoute.close();
     
                                }catch(Exception ex){System.out.println(ex.getMessage());}
                            }
                        };
                        threadlistpseudo.start();
    code client:

    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
     
    public void windowOpened(java.awt.event.WindowEvent e) {
                ///////requete pour demander la liste des connectés depuis le serveur
                    try {
                        ///state='c' =>connecté
                        String req1="select login from authentification where state='c'";
                        sClient =new Socket("localhost",3500);
                        out=new PrintWriter(sClient.getOutputStream(),true); 
                        out.write(req1+ "\r\n"); 
                        out.flush();
     
                        in=new BufferedReader(new InputStreamReader(sClient.getInputStream()));
                        String req=in.readLine();
                        DefaultListModel dlm=new DefaultListModel();
                        lpseudo.setModel(dlm);
                        while(req!=null)
                        { 
                            req=in.readLine();  
                            lpseudo.setModel(dlm);
                            dlm.addElement(req);    
                            lpseudo=new JList(dlm);        
                        }
                        sClient.close();
                    } catch (Exception ex) {System.out.println(ex.getMessage());
    }

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Il ne fait rien d'autre ton client ?
    Car dans ton code, tu te contentes de récupérer des infos du serveur puis tu coupes la connexion. Donc c'est normal que le client ne fasse rien d'autre.
    De plus il ne faut pas placer ton code dans l'EDT (le Thread qui gère entre autre l'interface graphique). La méthode "windowOpened" est appelée dans l'EDT.
    Pour plus d'infos sur l'EDT, regarde la FAQ et les tutoriels du site.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 57
    Par défaut
    mon client a pour rôle de charger la liste des utilisateurs connectés depuis la bd sur le serveur, ensuite je vais utiliser cette liste pour récupérer l'adresse ip des utilisateurs pour chater directement avec eux sans passer par le serveur,
    mais le probleme ici, c'est que lorsque le client se connecte il recupere cette liste des gens connecté depuis le serveur mais il reste en attente de quelquechose du serveur avant d'afficher la liste, si je tape quelquechose dans le serveur, le client se libere et affiche la liste

  4. #4
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    Ton client attend la fin de la communication (readLine). Ton serveur ne lui envoie aucun message. On pourrait indiquer la fin de la liste par l'envoi d'une ligne vide.

    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
    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
     
    Thread threadlistpseudo = new Thread() {
       public PrintWriter out=null;
       public BufferedReader in=null;
       public ServerSocket sEcoute=null;
       public Socket sService=null;
     
       public void run() {
         ////////repondre a la requete du client pour lui communiquer la liste des pseudo
         try {
           Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
           con = DriverManager.getConnection(url);
           stm = con.createStatement();
           sEcoute =new ServerSocket(3500);
           sService=sEcoute.accept();
     
           out=new PrintWriter(sService.getOutputStream(),true);
           in=new BufferedReader(new InputStreamReader(sService.getInputStream()));
     
     
           String query = in.readLine();
           rst = stm.executeQuery(query);
     
           while (rst.next()) {
             out.write(rst.getString(1)+ "\r\n");
             // -FMa- Il ne serait à rien de flusher à chaque rien et peut ralentir l'exécution
             //out.flush();
           }
           // -FMa- On indique la fin de la liste
           out.write("\r\n"); 
           out.flush();
           // -FMa- On libère toute les ressources dans finally 
           //sEcoute.close();
         }
         catch (Exception ex){
           // _-FMa- Il serait préférable d'envoyer les messages sur la sortie erreur
           System.out.println(ex.getMessage());}
         }
         finally {
           // _-FMa- On libère les ressources
           /* A faire pour in, out, rst, stm et con */
         }
       };
       threadlistpseudo.start();
    Client:
    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
     
    // -FMA- Même remarque que pour le programme serveur, on libère les ressources après les avoir utilisées.
    public void windowOpened(java.awt.event.WindowEvent e) {
      ///////requete pour demander la liste des connectés depuis le serveur
      try {
        ///state='c' =>connecté
        String req1="select login from authentification where state='c'";
        sClient =new Socket("localhost",3500);
        out=new PrintWriter(sClient.getOutputStream(),true);
        out.write(req1+ "\r\n");
        out.flush();
     
        in=new BufferedReader(new InputStreamReader(sClient.getInputStream()));
        DefaultListModel dlm = new DefaultListModel();
        lpseudo.setModel(dlm);
        // -FMa- On lit une ligne et on la traite. Dans le programme original,
        // la première ligne n'était pas traitée.
        String req = in.readLine();
        while(req!=null && !"".equals(req)) {
          lpseudo.setModel(dlm);
          dlm.addElement(req);
          lpseudo=new JList(dlm);
          req=in.readLine();
        }
        sClient.close();
      }
      catch(Exception ex) {
        System.out.println(ex.getMessage());
      }
    }

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/06/2009, 11h06
  2. bloquage d'un client de chat aprés l'envoi d'un message
    Par King_T dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 24/12/2008, 04h34
  3. Un client irc avec socket et fork
    Par cybersplash dans le forum POSIX
    Réponses: 6
    Dernier message: 12/04/2007, 20h22
  4. Chat (sockets + thread)
    Par raf_gug dans le forum MFC
    Réponses: 4
    Dernier message: 14/01/2004, 17h00
  5. probleme de gestion de clients avec des sockets....
    Par ludvo dans le forum Réseau
    Réponses: 6
    Dernier message: 25/09/2003, 12h37

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