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 :

comment attendre un évènement dans un programme en ligne de commande ?


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 8
    Points : 16
    Points
    16
    Par défaut comment attendre un évènement dans un programme en ligne de commande ?
    Lorsque je développe un programme graphique (awt /swing/...)
    j'utilise plus que fréquement les ActionListeners...

    Or dernierement je me suit lancé vers une application en ligne de commande (pas d' actionListener: mon but est d' éviter les bibliotheques graphiques) style client/server IRC (juste pour l' exemple, je ne colle pas du tout au protocole!)


    a un moment, mon client doit attendre
    -soit un evenement du serveur
    -soit un evenement de l' utilisateur


    et là ... c' est le drame !


    le code de ma partie 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
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
     
    package quizzy;
     
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
     
     
    public class QuizzyClient{
     
    	static final int port = 777;
     
    	userListener user;
    	serverListener server;
    	Socket socket;
    	BufferedReader in , inFromServer;
    	PrintWriter outToServer;
     
    	public static void main(String[] args)  throws Exception {
    		new QuizzyClient();	
    	}
     
     
    	QuizzyClient() throws IOException{
            socket = new Socket("127.0.0.1", port);
            System.out.println("SOCKET = " + socket);
     
     
            //a virer: test console
            in = new BufferedReader(new InputStreamReader(System.in));
     
     
     
            inFromServer = new BufferedReader(
                                   new InputStreamReader(socket.getInputStream())
                                   );
     
            outToServer = new PrintWriter(
                                 new BufferedWriter(
                                    new OutputStreamWriter(socket.getOutputStream())),
                                 true);
     
     
     
            //sequence d' initialisation (connexion au serveur)
            //mis ici surtout pour l' exemple de fonctionnement (oui, say pabo!)
            System.out.println("pseudo ?");
            outToServer.println("/nick "+in.readLine());
     
     
            System.out.println("salon ?");
            outToServer.println("/join "+in.readLine());
     
     
     
            //userListener et serverListener sont des objets de type thread qui attendent
            //un message de la console ou du serveur
     
            //lorsqu'ils detectent un message/commande, 
            //ils appellent les fonctions "userCommand" / "serverCommand" suivantes
     
            user = new userListener(this,in,System.out);
            server = new serverListener(this,inFromServer,outToServer);
     
       }
     
    	protected void userCommand(String str){
     
    			try{
     
    	           if (str.charAt(0)=='/'){		//si c' est une commande:
    	        	   String[] command = str.split(" ");
     
    	        	   if(command[0].equals("/quit")){//client deconnection
    	        		   System.out.println("fin du programme client !");     // message de terminaison
    	        	        inFromServer.close();
    	        	        outToServer.close();
    	        	        socket.close();
     
    	        	   }else if(command[0].equals("/killserv")){//kill le serveur !
    	        		   user.say("/quit");
     
    	        	   }else{ //pas une commande locale: on envoie au serveur !
     
    	        		   server.say(str);
    	        	   }
    	           }else{  						//si c'est pas une commande (pas de prefixe '/') !
    	        	   server.say(str); 		// envois du message au serveur
    	           }
     
    	        }catch (Exception e) {
    				// TODO: handle exception
    			}
    	}
     
     
    	protected void serverCommand(String str){
    		System.out.println(str); //ecourté ... ressemble à userCommand mais vers le serveur
    	}
     
     
    }
    merci plein d' avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ben comme ça je ne vois rien de choquant, ça me semble plutôt convenable ...
    Quand tu dis c'est le drame, ça veut dire qu'il se passe quoi ??

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 8
    Points : 16
    Points
    16
    Par défaut
    en gros il finit le code du constructeur, et là le socket est tout cassé ! (il est apparement nettoyé par le ramasse-miette)

    ce que je trouve bizare c' est que java me demolisse mon socket car il est lié dans mon objet quizzyClient, lui-même comportant des references à des objets en attente (userListener user et serverListener server) par une commande du style ( inFromServer.readLine(str) )

    --> genre de fonction sympatique mais qui bloque l' avancement du processus, d' ou l' interêt de les mettre dans on thread à part!



    PS "Et là, c' est le drâme" nous viens de cette myrifique emmission de télé qui raconte des drames sociaux fictionnels sur AB3 (et dont j' ai oublié le nom)"

  4. #4
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    A mon avis le problème se situe plutôt au niveau de tes objets userListener et serverListener ... Tu pourrais nous montrer le code ?
    Sinon, j'avais oublié, les conventions de nommage (notamment pour ces deux classes) c'est bien ! :sms:

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/12/2006, 00h09
  2. [VB.net] Comment attendre la fin d'un programme ?
    Par nakata77 dans le forum VB.NET
    Réponses: 2
    Dernier message: 14/09/2006, 17h16
  3. Comment jouer des sons dans un programme ???
    Par aldur_disciple dans le forum MFC
    Réponses: 8
    Dernier message: 17/08/2005, 12h10

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