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 :

[Réseau]Problème pour faire une application clients/serveur en Java


Sujet :

Entrée/Sortie Java

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 25
    Points
    25
    Par défaut [Réseau]Problème pour faire une application clients/serveur en Java
    Bonjour,
    j'ai essayé de faire une application avec plusieurs clients, et un seul serveur en Java. Pour cela, j'utilise une classe Clients et une classe Serveur (je suppose ici que les clients et le serveur sont représentés par la même machine). Le serveur ne doit, en principe, pas savoir combien de clients il devra traiter, j'ai donc utilisé une boucle "while(true)" , avec un traitement de requête d'un client par tour de boucle. J'ai donc 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
    18
    ServerSocket ss = new ServerSocket(1100);
         while(true)
         {
         Socket s = ss.accept();
         System.out.println("Connexion acceptee");
         InputStream is = s.getInputStream();
         OutputStream os = s.getOutputStream();
         DataInputStream dis = new DataInputStream(is);
         DataOutputStream dos = new DataOutputStream(os);
         PrintStream pr = new PrintStream(os);
     
         String str = dis.readLine();
         System.out.println(str);
         pr.println(str + "Reponse");
     
         s.close();
         }
    ss.close();
    Le problème vient de la dernière ligne de code : pour fermer le serveur, j'utilise la méthode "close" de la classe ServerSocket. Le problème est que, comme elle se situe après une boucle infinie, le problème ne peut théoriquement jamais y accéder, et cela génère une erreur à la compilation. Qqn pourrait-il me dire s'il existe un moyen de résoudre ce problème ??
    Merci d'avance.

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut Re: Problème pour faire une application clients/seveur en Ja
    Salut,

    Citation Envoyé par Yakurena
    Le problème vient de la dernière ligne de code : pour fermer le serveur, j'utilise la méthode "close" de la classe ServerSocket. Le problème est que, comme elle se situe après une boucle infinie, le problème ne peut théoriquement jamais y accéder, et cela génère une erreur à la compilation.
    Le compilateur a tout à fait raison de bloquer ce code : même en pratique tu ne peux jamais accéder à la ligne ss.close() !
    Ce "bloquage" du compilateur permet d'éviter certaines boucles infinis non-souhaité...

    Citation Envoyé par Yakurena
    Qqn pourrait-il me dire s'il existe un moyen de résoudre ce problème ??
    Il faut tout simplement que tu détermines une condition de sortie... Cela dépend donc du moyen par lequel le serveur devra s'arrêter...

    Par exemple si c'est un des clients qui doit lui envoyer un message de fermeture, il suffit de gérer la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ServerSocket ss = new ServerSocket(1100);
         boolean running = true;
         while(running)
         {
         // Traitement ...
     
         if ("END_SERVER".equals(str)) {
              running = false;
         }
    }
    ss.close();

    Sinon tu peux également tuer ton server par un Ctrl-C en utilisant un ShutdownHook comme dans l'exemple du de la FAQ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ServerSocket ss = new ServerSocket(1100);
    Runtime.getRuntime ().addShutdownHook (new Thread() {
    	public void run() {
    		try {
    			ss.close();
    		} catch (IOException lException) {
    			lException.printStackTrace();
    		}			
    	}
    });
    a++

    PS : j'ai rajouté les balises [ code ] dans ton message, merci d'y penser la prochaine fois

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    J'ai essayé de copier ta portion de code dans mon programme, mais il y'a toujours un problème : une fois les échanges clients-serveur terminés, quand je fais Ctrl-C pour terminer le programme, le thread qui doit en principe le terminer proprement ne s'éxécute pas ... ( j'en suis sûr, j'ai fait un test d'affichage dans la méthode run du thread, et il ne s'affiche pas). Ce qui fait que le processus correspondant au programme serveur tourne toujours après la fin de l'éxécution du programme, et, quand je veux le réexecuter, il déclenche une exception (BindException) disant que l'adresse est déjà utilisée ...
    Ca pourrait se résoudre avec un KeyListener (auquel j'associerais du code à l'appui sur Ctrl-C), mais mon programme n'est pas une application graphique ...

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Comment tu lances ton programme et comment tu lui envois le Ctrl-C ?
    Parce que même si la méthode run() n'est pas appellé, la socket serait fermé lorsque ton programme est fini... donc je pense qu'il ne dois pas recevoir le Crtl-C...

    a++

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    Jusque là, j'avais essayé de lancer les 2 programmes (client et serveur) sur un même terminal, et lançant le premier (le serveur) en arrière-plan.
    C'est dans ce cas-là que le Ctrl-C n'avait pas l'effet souhaité. Mais j'ai ensuite essayé de lancer chaque programme sur un terminal différent, et là, le programme marche bien : je lance 1 fois le serveur, puis j'éxécute le programme client le nb de fois que je veux sur l'autre terminal, ( ça fait une requête et une réponse du serveur à chaque fois). De cette façon, le programme serveur marche tant que je ne l'arrête pas moi-même. Et en faisant Ctrl-C, cette fois, le thread s'éxécute normalement, avec le message de fin de programme qui s'affiche.
    Je ne sais pas pourquoi ça marche dans un cas (2 terminaux) et pas dans l'autre (serveur en arrière-plan), mais l'essentiel est d'avoir réussi à faire tourner le programme. Merci beaucoup pour ton aide.

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    C'est normal, lorsque tu lances un processus en arrière plan, il ne recoit pas les Ctrl-C du terminal...

    Il faut soit le remettre en avant (fg sous Unix/Linux), soit lui envoyer une commande d'arrêt (kill -9 <process_num> sous Unix/Linux, via le gestionnaire des tâches sous Windows).

    a++

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

Discussions similaires

  1. [Batch] Problème pour lancer une application réseau
    Par amoniks dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 20/12/2010, 18h25
  2. Réponses: 13
    Dernier message: 18/06/2009, 17h43
  3. Réponses: 7
    Dernier message: 06/11/2008, 16h38
  4. Réponses: 2
    Dernier message: 30/09/2008, 02h43
  5. Quels composants utiliser pour une application client/serveur (mySql) ?
    Par whitespirit dans le forum Bases de données
    Réponses: 20
    Dernier message: 30/01/2008, 05h46

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