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

Collection et Stream Java Discussion :

Process : Communication via les streams


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Par défaut Process : Communication via les streams
    Bonjour,

    Voilà je suis un fan de Transport Tycoon et je mets souvent un serveur à disposition chez moi. Le problème c'est qu'il tourne dans une console et c'est pas évident de l'administrer ! C'est pourquoi j'ai voulu développer une petite interface graphique pour celui-ci lors de mes après-midi de perdues ...

    Jusque là tout va bien, dans un premier temps j'aimerais mettre en place la communication avec le servuer en créant une console ou je peux envoyer des commandes et récupérer leurs résultats via des streams.

    Premièrement j'ai remarqué que les messages normaux s'envoyaient via le "errorStream" et les retours des commande via le stream normal. Le problème est que je peux envoyer des commandes, cela fonctionne mais le résultat de celles-ci s'affichent que lorsque j'arrête le serveur (j'envoie la commande exit).

    J'ai regardé en vitesse la doc mais cela ne m'a pas beaucoup aidé ...

    J'aimerais savoir si il est possible d'écouter en même temps indépendemment les deux streams ?

    Normalement j'imagine que oui je vois pas trop ou est le problème, pourtant j'ai crée des threads ... Enfin peut-être que j'ai fai une erreure dans le code ... ??!! Mais d'après les message que j'ai mis pour débuger, celà à l'air de jouer....

    Je sais que c'est pénible à regarder, y'à pas mal d'objets mais je mets quand même mon code à disposition, y'à toujours des motivés qui arrivent exécuter du code "de cerveau" et qui trouvent l'erreur ;-)

    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
     
    public class ServerManager{
     
    	private String openTTDFolder;
    	private ServerProcess serveurProcess;
    	private InterfaceControleur controleur;
     
    	/*
    	 * Lance l'exécutable d'openTTD
    	 */
    	public void startServer(String commande) throws IOException{
    		// Lance le processus
    		serveurProcess = new ServerProcess(controleur);
    		serveurProcess.startProcess(commande);
    	}
     
            /*
    	 * Envoie une commande vers le serveur.
    	 */	
    	public void sendCmd(String cmd) throws IOException{
    		serveurProcess.sendCmd(cmd);
    	}
            ... ... ... ... 
    }
     
    public class ServerProcess implements Runnable{
     
    	private InterfaceControleur controleur;
    	private Process serveurProcess;
    	private ServerCmdInterpreter cmdInterpreter;
     
    	public ServerProcess(InterfaceControleur controleur){
    		this.controleur = controleur;		
    	}
     
    	/*
    	 * Démarre le processus du serveur
    	 */
    	public void startProcess(String commande) throws IOException{
    		serveurProcess = Runtime.getRuntime().exec(commande + " -D");
    		// Lance le thread d'écoute
    		Thread th = new Thread(this);
    		th.start();
    		// Lance l'interpreteur de commandes
    		cmdInterpreter = new ServerCmdInterpreter(controleur,
    				serveurProcess);
    		cmdInterpreter.listen();
    	}
     
    	/*
    	 * Ecoute les messages du serveur
    	 */
    	public void run(){
    		try{
    			BufferedReader reader = new BufferedReader(
    					new InputStreamReader(
    						serveurProcess.getErrorStream()));
    			String message;
    			while((message = reader.readLine()) != null) {
    				controleur.messageFromServeur("process : " + message);			
    			}
    		}
    		catch(IOException ioe){
    			controleur.serverErrorOccured(ioe);
    		}
    		controleur.stopServeur();
    		controleur.messageFromServeur("Server Stopped");		
    	}
     
    	/*
    	 * Envoie une commande vers le serveur.
    	 */	
    	public void sendCmd(String cmd) throws IOException{
    		cmdInterpreter.sendCmd(cmd);
    	}
            ... ... ... ... 
    }
     
    public class ServerCmdInterpreter implements Runnable{
     
    	private InterfaceControleur controleur;
    	private Process serveurProcess;
    	private PrintWriter printer;
     
    	public ServerCmdInterpreter(InterfaceControleur controleur,
    			Process serveurProcess){
    		this.controleur = controleur;
    		this.serveurProcess = serveurProcess;		
    	}
     
    	/*
    	 * Démarre l'écoute
    	 */
    	public void listen(){
    		Thread th = new Thread(this);
    		th.start();
    		printer = new PrintWriter(
    				new PrintStream(
    						serveurProcess.getOutputStream())); 
    	}
     
    	/*
    	 * Ecoute en permanence les résultats d'une commande
    	 */
    	public void run(){
    		BufferedReader reader = new BufferedReader(
    				new InputStreamReader(
    						serveurProcess.getInputStream()));		
    		try{
    			String message;
    			System.out.println("Ecoute les resultats des commandes");
    			while((message = reader.readLine()) != null){
    				controleur.messageFromServeur("interpreter : " + message);
    			}
    		}
    		catch (IOException ioe){
    			controleur.serverErrorOccured(ioe);
    		}
     
    		System.out.println("End Interpreter");
    	}
     
    	/*
    	 * Envoie une commande vers le serveur.
    	 */	
    	public void sendCmd(String cmd) throws IOException{
    		System.out.println("Commande : " + cmd);
    		printer.println(cmd);
    		printer.flush();
    	}
    }
    En démarrant mon application et en tapant ceci dans ma console "home made" :
    Voici ce que j'ai dans la console java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Ecoute les resultats des commandes
    Commande : list_cmds
    Commande : exit
    End Interpreter
    et cela s'affiche en "direct", les threads on l'air d'être bien lancés, alors que le résultat de la commande "list_cmds" s'affiche dans ma console "home made" qu'après l'arrêt du serveur (commande exit terminée).

    Ai-je été assez clair ? ... ?? .. ! Peut-être pas mais si vous répondez à la question en gras, peut-être que j'aurai un indice ...

    Merci pour votre patience ;-)

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Par défaut
    Personne n'a une idée ou pourrais m'expliquer la véritable différence entre les deux stream ??! Merci !

Discussions similaires

  1. Réponses: 20
    Dernier message: 28/10/2010, 11h19
  2. Réponses: 4
    Dernier message: 23/03/2010, 21h34
  3. Réponses: 6
    Dernier message: 25/01/2008, 13h47
  4. communication entre 2 webapps via les contextes
    Par clement42 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 01/12/2006, 13h33
  5. [C#] Communication avec les ports parallèle et RS232
    Par jejerome dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/07/2004, 22h57

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