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] [client/server] Transmettre la sortie standard


Sujet :

Entrée/Sortie Java

  1. #1
    Membre averti Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Par défaut [réseau] [client/server] Transmettre la sortie standard
    Bonjour,

    J'essaye de développer une appli client-server: le client envoie des commandes au server et ce dernier les exéctute (Runtime.exec()) et renvoie stdout du process sur la sortie standard de mon server.

    OR, je voudrais envoyer cette sortie standard vers mon client (pour qu'il voit ce qui se passe côté server). Ma question est la suivante:

    Quel type de stream dois-je utiliser (sachant que j'ai déjà des ObjectIn(out)putStreams pour faire transiter mes commandes? Et comment créer cette stream sortante à partir de mon System.out de mon server?

    Merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Par défaut
    merci a tripop1 pour ce lien tire d'un post precedent
    http://www.rgagnon.com/javadetails/java-0014.html
    Voila pour la recuperation du flux de sortie de ton process. Ensuite pour le renvoyer a ton client ba il te suffit de faire la meme chose avec le Socket (ou avec URLConnection si tu l'utilise) qui t'as permis de recuperer la requete. Tu recuperes le OutPutStream et tu ecris dessus.

  3. #3
    Membre averti Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Par défaut
    Citation Envoyé par mimil
    merci a tripop1 pour ce lien tire d'un post precedent
    http://www.rgagnon.com/javadetails/java-0014.html
    Voila pour la recuperation du flux de sortie de ton process. Ensuite pour le renvoyer a ton client ba il te suffit de faire la meme chose avec le Socket (ou avec URLConnection si tu l'utilise) qui t'as permis de recuperer la requete. Tu recuperes le OutPutStream et tu ecris dessus.
    C'est exactement ce code que j'ai choppé et qui me renvoit la sortie standard de mes processes externes vers ma sortie standard de mon server.

    Maintenant il faudrait que je choppe la sortie standard de mon server et que je l'envoie vers mon client, quasiment en temps réel, c'est pour ça qu'un traitement sur des objects me paraissait pas tiptop...

  4. #4
    Membre averti
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Par défaut
    Ou est ce que tu coinces en fait dis moi précisément ce qui te dérange. Il te suffit de recuperer le flux de sortie de ton socket et d'ecrire dessus ton objet si tu as un objet.
    Comme ca par exemple:
    _oos=new ObjectOutputStream(_socket.getOutputStream());
    _oos.writeObject(monObjet);
    Si tu veux juste rediriger ton flux de sortie de ton process tu dois pouvoir faire un truc comme ca:
    BufferedInputStream is=new BufferedInputStream(monProcess.getInputStream());
    bytes buf[];
    while (is.read(buf)!=null){ socket.getOuputStream().write(buf)}

  5. #5
    Membre averti Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Par défaut
    Citation Envoyé par mimil
    Ou est ce que tu coinces en fait dis moi précisément ce qui te dérange. Il te suffit de recuperer le flux de sortie de ton socket et d'ecrire dessus ton objet si tu as un objet.
    Comme ca par exemple:
    _oos=new ObjectOutputStream(_socket.getOutputStream());
    _oos.writeObject(monObjet);
    Si tu veux juste rediriger ton flux de sortie de ton process tu dois pouvoir faire un truc comme ca:
    BufferedInputStream is=new BufferedInputStream(monProcess.getInputStream());
    bytes buf[];
    while (is.read(buf)!=null){ socket.getOuputStream().write(buf)}
    Oui ça me parait une bonne solution ça mais mon problème est que je ne sais pas trop comment gérer ces deux types de flux qui vont arriver sur mon client.

    D'un côté j'aurais des objets, normaux, que je traite en sous-castant et en appliquant le traitement adéquat. De l'autre j'aurais des byte[].

    Donc en fait ce que je pense faire c'est ça:

    à partir de mon Socket, je choppe l'OutputStream.
    à partir de cet OutputStream je crée un ObjectOutputStream et un autre flux pour récupérer ma stdout.

    du côté de mon client, j'ai deux thread qui bouclent, chacun en attente sur un des flux créés ci dessus.

    Ca te parait jouable ça?

  6. #6
    Membre averti
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Par défaut
    Oui ça me parait une bonne solution ça mais mon problème est que je ne sais pas trop comment gérer ces deux types de flux qui vont arriver sur mon client.
    Pourquoi gerer deux types de flux je ne comprend pas. Que tu fasses avec un ObjectOutputStream ou un InpuStream, les données qui transites sont toujours en binaires, la seule difference reside dans le fait que dans le cas de ton objet, il sera serialise, c'est a dire qu'il sera transformé en flux biniare ainsi que les objets auxquel il fait reference(agregation).
    Donc si tu doit absoluement envoyer des données qui sont de differentes natures, ba tu peux faire un try catch avec un cast en objet et si cela leve une exception tu effectue le traitement pour ta recup de la sortie de ton process(dans le catch). Sinon tu peux meme coller la sortie de ton process dans ton objet, enfin bref c pas les solutions qui manquent ^^.
    Donc voila je sais pas si jai repondu a tes interrogations. Le mieux serait que tu embrayes sur un bout de code et que tu me montres ou tu bloques.

  7. #7
    Membre averti Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Par défaut
    Voilà ce que j'ai pour l'instant côté client:

    Cette fonction attend un object sur une ObjectInputStream:

    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
    while (online) {
    					if (this.online) {					
    						try {
    							// wait for a message
    							Object message = input.readObject();
     
    							treatMessage((AbstractMessage) message); 
    						}
    						catch (IOException ioException) {
    							online = false;          
    						}
    						catch (ClassNotFoundException cNFE) {
    							cNFE.printStackTrace();
    						}
    					}
    J'arrive pas à piger comment ça fonctionne ces streams.. Je peux pas décemment écrire une sortie standard sur un flux d'objects, ou alors je comprends pas comment ça peut être jouable.. Ok c'est un flux binaire dans les deux cas, mais tu me proposes de tester dans ma boucle déjà existante si je reçois un AbstractMessage ou autre chose? et si c'est autre chose, c'est à priori du texte provenant de ma stdout?

  8. #8
    Membre averti
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Par défaut
    Oui tu vois que la methode readObject() leve une exception de type ClassNotFoundException, donc je pense que cette exception va etre levee dans le cas ou le flux ne correspond pas a un objet. Si ce n'est pas le cas tu auras de toute facon une ClassCAstException qui te sera levée au moment de ton cast en AbstractMessage .Donc a ce moment la tu fais le traitement du flux du process dans le catch:
    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
     
    while (online) { 
                   if (this.online) {                
                      try { 
                         // wait for a message 
                         Object message = input.readObject(); 
     
                         treatMessage((AbstractMessage) message); 
                      } 
                      catch (IOException ioException) { 
                         online = false;          
                      } 
                      catch (ClassNotFoundException cNFE) {
                        input.read(byte buf[],buf.length);
                         traitementProcess(buf.toString()); 
                         cNFE.printStackTrace(); 
                      }
                      catch (ClassCastException cNFE) { 
                         traitementProcess(message.toString()); 
                         cNFE.printStackTrace(); 
                      } 
     
                   }
    Bon tente un truc dans le genre ou ca leve une exception a la methode readObject et tu laisse tomber le catch (ClassCastException cNFE) ou alors tu fais le traitement dans le classCAst.

  9. #9
    Membre averti Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Par défaut
    Dans l'immédiat j'ai opté pour une solution pas jolie mais qui marche:

    Je lance mon process en lui passant l'ObjectOutputStream utilisé pour mes autres messages, celui ci fait cela en fait:

    BufferedReader input = new BufferedReader (new
    InputStreamReader(p.getInputStream()));
    while ((line = input.readLine()) != null) {
    System.out.println(line);
    sendMess(line, oos);

    Donc je choppe la stdout de mon process ligne par ligne, je l'affiche sur System.out, pour suivre le truc, et j'envoie chaque ligne dans un message de type Message (donc pas de ClassCastException etc..). Je mets un flag à mon message l'identifiant comme un message de type console et j'append ma ligne à un textarea coté client.

    Ca fait donc le traitement ligne par ligne, et c'est pas optimisé je pense.. Mais c'est pas voué à être de l'échange intensif intensif, donc j'espère que ca passera...

    Merci pour ton aide, je tenterai ta solution si j'ai un peu de temps en rab. C'est sympa

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/10/2008, 19h05
  2. [SQL Server 2005][Client] utilitaire réseau client
    Par gunico dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/03/2006, 09h29
  3. [ado][sql server] CLIENT/SERVER
    Par nil dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/04/2004, 08h12
  4. Réponses: 5
    Dernier message: 24/12/2003, 09h49
  5. Réponses: 16
    Dernier message: 18/07/2003, 17h16

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