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

EDT/SwingWorker Java Discussion :

[swing][socket]méthode ServerSocket.accept() bloquante?


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Inscrit en
    Octobre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 150
    Par défaut [swing][socket]méthode ServerSocket.accept() bloquante?
    Je m'explique, j'ai une socket qui attend la connexion d'un client. Pour cela j'utilise la méthode accept de mon serversocket. Après cette connexion je dois fermer une fenêtre, or cela ne la ferme pas.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ServerSocket ecoute = new ServerSocket(5000,1);
    Socket connexion = (Socket)null;
     
    connexion = ecoute.accept();
     
    System.out.println("Un joueur s'est connecté");
     
    monDialog.dispose();
    Les deux dernières lignes de code ne s'exécutent pas sauf si, une fois qu'un client s'est connecté, je ferme "monDialog" en cliquant sur la croix, là "un joueur s'est connecté" s'affichera. Je comprends rien, help.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Comment est-ce que tu affiches ton JDialog ? Ce ne serait pas cet affichage qui serait bloquant par hasard (et du coup tu ne rentre dans accept() qu'après avoir fermer la JDialog).

    a++

  3. #3
    Inactif
    Inscrit en
    Octobre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 150
    Par défaut
    Je fais monDialog.setVisible(true);

    Et j'ai essayé en le mettant modal ou non, cela ne change rien. (et puis je veux que cela marche en modal).

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par the_ugly
    Et j'ai essayé en le mettant modal ou non, cela ne change rien. (et puis je veux que cela marche en modal).
    Lorsque la boite de dialogue est modal cela bloque le thread courant jusqu'à ce que la boite de dialogue soit fermé...

    Donc tu ne passes réellement dans le accept() que lorsque la JDialog est fermé...
    Pour éviter cela il faudrait que tu utilises au moins deux threads (un pour ouvrir la JDialog, et un pour attendre les connections clients).

    a++

  5. #5
    Inactif
    Inscrit en
    Octobre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 150
    Par défaut
    Merci, mais en non modal cela ne marche pas non plus (même si l'erreur est différente : on ne voit plus la barre de progression et cela "efface" une partie de la fenêtre parente). Et utiliser deux classes pour afficher une barre d'attente de rien du tout cela ne me dit rien. Je vais chercher ailleurs, merci quand même.

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par the_ugly
    Merci, mais en non modal cela ne marche pas non plus
    J'ai testé avec le code suivant :
    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
    	System.out.println("1");
     
    	final JFrame f1 = new JFrame("F1");
    	f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	f1.setSize(400,400);
    	f1.setLocationRelativeTo(null);
    	f1.setVisible(true);
     
    	System.out.println("2");
     
    	JDialog d = new JDialog(f1, "dialog");
    	d.setSize(20,20);
    	d.setLocationRelativeTo(d.getParent());
    	d.setModal(true);
    	d.setVisible(true);
     
    	System.out.println("3");
    Si la JDialog est modale, j'ai "1" et "2" qui s'affiche, puis "3" seulement lorsque je ferme la boite de dialogue (donc setVisible() est bloquant). Alors que si la JDialog n'est pas modale, j'ai bien "1" "2" et "3"...

    Citation Envoyé par the_ugly
    (même si l'erreur est différente : on ne voit plus la barre de progression et cela "efface" une partie de la fenêtre parente).
    A mon avis cela vient plutot d'un problème avec le thread d'evenement d'AWT... Si tu effectues des traitements long ou bloquant dans ce thread l'affichage ne peut pas être actualisé.

    Vérifie cela avec la méthode SwingUtilities.isEventDispatchThread(), et effectue le traitement dans un thread séparé

    Citation Envoyé par the_ugly
    Et utiliser deux classes pour afficher une barre d'attente de rien du tout cela ne me dit rien. Je vais chercher ailleurs, merci quand même.
    Je ne parle pas de classe mais de thread... Si tu veux faire plusieurs choses en même temps (attendre une socket, afficher une barre de progression et actualiser l'affichage de ta fenêtre), il faut bien que tu utilises plusieurs threads... maintenant tu fais comme tu veux

    a++

  7. #7
    Inactif
    Inscrit en
    Octobre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 150
    Par défaut
    C'est bon finalement j'ai fait un autre thread pour la méthode accept, merci AdiGuba.

    Pour ceux que cela intéresse voici le code du thread d'attente :

    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
    import java.net.ServerSocket;
    import java.net.Socket;
     
    import javax.swing.JDialog;
     
    public class ThreadAttente extends Thread {
     
    	private volatile JDialog monDialog;
     
    	public ThreadAttente(JDialog monDialog){
    		this.monDialog=monDialog;
    	}
     
    	public void run(){
    		try {
    			ServerSocket ecoute = new ServerSocket(5000,1);
    			Socket connexion = (Socket)null;
     
    			connexion = ecoute.accept();
     
    			monDialog.dispose();
     
    			connexion.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
     
    }
    monDialog est une fenêtre affichant une barre de progression :

    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
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JProgressBar;
    import javax.swing.SwingUtilities;
     
    public class EcouteurCreer implements ActionListener {
     
    private JDialog prec;
     
    	public EcouteurCreer(JDialog prec){
    		this.prec=prec;
    	}
     
    	public void actionPerformed(ActionEvent arg0) {
    		prec.dispose();
     
    			//affichage de la fenêtre d'attente
    			JDialog monDialog = new JDialog(Go.fenetre_principale,"Attente d'un joueur",true);
     
    			monDialog.setLayout(new FlowLayout());
    			JProgressBar progression=new JProgressBar(JProgressBar.HORIZONTAL);
    			//barre de progression pour un temps indéterminé
    			progression.setIndeterminate(true);
    			monDialog.add(progression);
    			monDialog.pack();
    			//centrage de la boîte de dialogue
    			Point p = Go.fenetre_principale.getLocation();
    			Dimension d1 = Go.fenetre_principale.getSize();
    			Dimension d2 = monDialog.getSize();
    			p.translate( (d1.width - d2.width)/2, (d1.height - d2.height)/2 );
    			monDialog.setLocation(p);
     
    			ThreadAttente attente=new ThreadAttente(monDialog);
    			attente.start();
     
    			monDialog.setVisible(true);
     
    			System.out.println("Un joueur s'est connecté");
     
    			//traitements jusqu'à la fin de partie
     
     
    	}
     
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème Swing / socket bloquant
    Par soussou92 dans le forum AWT/Swing
    Réponses: 0
    Dernier message: 12/05/2010, 13h29
  2. Réponses: 4
    Dernier message: 18/02/2010, 16h31
  3. Socket et ServerSocket
    Par Janitrix dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 17/04/2006, 21h13
  4. [SWING][THREAD]Méthodes pour afficher une Frame
    Par pompidouwa dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 05/05/2004, 10h35
  5. [Sockets] Timeout sur accept() ?
    Par MikB dans le forum Développement
    Réponses: 2
    Dernier message: 30/12/2003, 17h22

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