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 :

Problème boucle + datagramSocket


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Points : 29
    Points
    29
    Par défaut Problème boucle + datagramSocket
    Bonjour,
    Je suis en train de réaliser un chat UDP avec une IHM swing pour un projet de formation.
    Je suis en train de faire le serveur et j'ai un petit souci.
    Lorsque je saisie un port dans la JOptionPane pour me connecter, j'ai ce message dans la console :

    java.net.BindException: Address already in use
    at java.net.PlainDatagramSocketImpl.bind0(Native Method)
    at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:94)
    at java.net.DatagramSocket.bind(DatagramSocket.java:392)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:242)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:299)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:271)
    at Serveur.main(Serveur.java:65)
    En fait, ça marchait bien jusqu'à ce que j'essaie de gérer les erreurs de saisie de port (saisie de lettre par exemple ou aucune saisie).
    J'ai fais une boucle pour que la JOptionePane me redemande systématiquement de saisir un port en cas d'erreur.
    Donc je pense que cela vient de la boucle mais je ne vois pas à quel niveau.

    Je vous mets mon code :

    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
    import java.io.IOException;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    import java.util.ArrayList;
     
    import javax.swing.JOptionPane;
     
     
     
    public class Serveur 
    {
     
    	public static void main(String[] args)
    	{
    		try
    		{
    			ViewServeur vs = new ViewServeur();
    			ArrayList<Paquet> clients = new ArrayList<Paquet>();
     
     
    			String op;
    			int port = 0;
     
    			//Boucle pour demander un numéro de port
    			do
    			{
    				op = JOptionPane.showInputDialog(" Veuillez saisir un port");
    				if(op == null)
    				{
    					System.exit(0);
    				}
     
    				//Si port 0 alors message d'erreur (car port 0 réservé au systeme)
    				else if(op.equals("0"))
    				{
    					JOptionPane.showMessageDialog(null, "Vous ne pouvez pas choisir le port 0");
    					op ="";
    				}
     
    				//Traitement de la saisie si autre que 0
    				else
    				{
    					try
    					{
    						//ajout de la saisi (string) dans une variable int
    						port = Integer.parseInt(op);
    					}
    					catch (Exception e)
    					{
    						//Si la saisie n'est pas un numéro ou est vide
    						JOptionPane.showMessageDialog(null, "Vous n'avez pas saisi de numéro");
    						op = "";
    					}
    				}
    			} while (op.equals(""));
     
    			//Actualisation du statut de connection
    			vs.setPort(true);
     
    			//Création d'un socket en UDP
    			do 
                {
                    DatagramSocket ds = new DatagramSocket(port);
                    new ThreadClient(ds, clients, vs).start();
                } while (true);
    		}
    		catch (IOException e)
    		{
    			e.printStackTrace();
    		}
     
     
    	}
     
    }
    Donc le code ci-dessus ne fonctionne pas.

    Mais le code ci-dessous fonctionne très bien :
    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
    import java.io.IOException;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    import java.util.ArrayList;
     
    import javax.swing.JOptionPane;
     
     
     
    public class Serveur 
    {
     
    	public static void main(String[] args)
    	{
    		try 
            {
                ViewServeur vs =  new ViewServeur();
     
                ArrayList<Paquet> clients = new ArrayList<Paquet>();
                int port = Integer.parseInt(JOptionPane.showInputDialog("Tapez un port"));
                vs.setPort(true);
                do 
                {
                    DatagramSocket ds = new DatagramSocket(port);
                    new ThreadClient(ds, clients, vs).start();
                } while (true);
            } 
            catch (IOException ioe) { }
     
    	}
     
    }
    Voyez-vous d’où cela provient ?

  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
    Hello,

    pour commencer tu pourrais peut-être fermer les sockets quand tu ne t'en sers plus ?

    "Address already in use", le message que tu vois en premier dans l'erreur obtenue, tu penses que ça veut dire grosso-modo quoi, à ton avis ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Points : 29
    Points
    29
    Par défaut
    Salut,
    Merci de ton aide.

    J'ai bien compris ce que le message d'erreur veut dire. Mais je ne comprenais pas pourquoi ça me le mettais que dans le premier code et pas dans le second. Je pensais que cela venais de la premier boucle mais en fait je me rends compte que dans le second code (celui qui fonctionnait), je n'ai pas mis le printStackTrace();
    Du coup, en l'ajoutant, ça me fait l'erreur aussi évidement...

    C'est pas faute d'avoir passé 2h à chercher l'erreur...
    Je crois qu'après avoir passé 10h d'affilées sur l'ordi, je ne voyais plus rien.

    Merci encore.

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

Discussions similaires

  1. Problème Boucle Do-While?!
    Par Julien_C++ dans le forum C++
    Réponses: 6
    Dernier message: 29/07/2006, 12h23
  2. [Débutant] Problème boucle for
    Par toniooooo dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 14h42
  3. [XSL] problème boucle
    Par VolaiL dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/04/2006, 16h55
  4. Problème boucle while et evenement
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 30/03/2006, 18h11
  5. [FLASH 8] Problème Boucle For
    Par Begood dans le forum Flash
    Réponses: 6
    Dernier message: 21/03/2006, 11h36

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