Envoyer/recevoir valeurs avec un exécutable

cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 janvier 2009 - 4 janv. 2005 à 17:12
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 - 4 janv. 2005 à 22:11
Bonjour,

J'ai deux applications : l'une en Java et l'autre un exécutable windows.

J'aimerais que l'exe et le java puisse se communiquer une valeur entre eux.

Par exemple, losque les 2 programmes sont lancés, j'aimerais qu'un champ texte de l'application java se mette à jour avec la valeur envoyée par l'exe.

Quelqu'un aurait-il une idée ?
Merci

Orélien.

3 réponses

cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 11
4 janv. 2005 à 19:02
ouai ben ;o) le mieu c de trouver une autre solution ;o)
;o)

autrement tu peu essayer par la communication avec TCP/IP ;o) ce qui semblerai une bonne soluce ;o)

Mais de facon plus archaique ;o) tu peu passer des valeur par un fichier texte (ou pas) et metre ton prog java a l ecoute des modif sur ce fichier (a l aide d un thread ;o) )..

voi rien d autre pour l instant ;o)

ah!! Si ;o) cela doi aussi etre possible avec des methode JNI (mais pas forcement la bonne soluce ;o) )

GL

++

GodConan
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
4 janv. 2005 à 19:39
bof, je sais pas si c'est aussi compliqué que çà ^^, en tout cas, si le
programme externe est lancé par le programme java. Sinon...



j'avais fait en Java une interface pour le jeu de Go Gnugo, qui
communique simplement avec des OutputStream et InputStream tout simples
^^.

Mais si le programme externe est déjà lancé au moment du lancement du
programma Java, alors, j'ai pas mieux que GodConan ^^: passer par JNI.



Comme je suis un peu flemmard ce soir, je te fais un copier coller de toute la classe concernée, c'est un peu gros, mais bon ^^.



A+
Dobel
[Une fois rien, c'est rien; deux fois
rien, ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà
s'acheter quelque chose, et pour pas cher]



package gnugoj;

import java.io.*;

import java.lang.*;



/**

* Description : Connexion suivant le GMP (Go Modem Protocol) vers un autre programme.

* La communication se fait par les flux systèmes.

* Elle est asynchrone. Chaque question est traitée immediatement.

* Les commandes sont envoyées par envoie(), envoieMouvement() et envoieOK().

* L'implémentation du protocol GMP n'est pas complète.

*/



public class Connexion implements Runnable{



private Thread thread;

private Partie partie;

/**

* Le Process qui contrôle l'exection du programme de Go

*/

private Process proc;

/**

* Le stream des flux sortant vers le programme de Go

*/

private OutputStream out;

/**

* Le stream des flux provenant du programme de Go

*/

private InputStream in;



private boolean maSequence = false;

private boolean saSequence = true;

private int commandeReponse;

private int paramReponse;



private final int OK = 0;

private final int DENY = 1;

private final int NEWGAME = 2;

private final int QUERY = 3;

private final int ANSWER = 4;

private final int MOVE = 5;

private final int RULES=7;

private final int JAPANESE = 1;

private final int CHINESE = 2;

private final int HANDICAP = 8;

private final int SIZE = 9;

private final int COLOR = 11;

private final int WHITE = 1;

private final int BLACK = 2;



private boolean enMarche=true;







/**

* Constructeur

*

* @param commande Le path du programme adverse

* @param partie La partie qui créée cette connexion

*

*/

public Connexion(String commande, Partie partie) {

this.partie = partie;

try {

proc = Runtime.getRuntime().exec(commande);

out = proc.getOutputStream();

in = proc.getInputStream();

start();

}

catch (Exception e) {

e.printStackTrace();

}

}



/**

* Démarage du thread

*/

public void start() {

if (thread==null) thread = new Thread(this);

thread.start();

}

/**

* fin du thread

*/

public void stop() {

if (thread!=null) thread = null;

}



/**

* Fermeture de la connexion

*/

public void close(){

try {proc.destroy();}

catch (Exception e) {}

try {out.close();}

catch (Exception e) {}

try {in.close();}

catch (Exception e) {}

try {proc.waitFor();}

catch (Exception e) {}

enMarche=false;

stop();

//System.out.println(this+" -> Terminée");

}



/**

* Boucle principale

*/

public void run() {

while (enMarche) {

try {//on alterne lecture d'une commande et réponse à la commande

lireReponse();

repondre();

}

catch(Exception e) {}

}

}



/**

* Lecture des commandes envoyées

* @throws IOException - flux interrompu

*/

public void lireReponse() throws IOException{

//Lire la description du protocol pour la suite.

int byte1 = in.read();

while ((byte1&128)!=0) in.read();//seul le byte start commence par 0



int check = in.read();

int byte3 = in.read();

int byte4 = in.read();

if ((check&128)==0 || (byte3&128)==0 || (byte4&128)==0)

return;

if (calculerChecksum((byte) byte1, (byte) byte3, (byte) byte4)!= (byte) check)

return;



commandeReponse = (byte3&0x70)>>4;//Recuperation de la commande reçue

paramReponse = ((byte3&0x7)<<7) | (byte4&0x7F);//Recuperation du paramètre de la commande reçue

boolean saSequ = (byte1&0x1)==1;

if (saSequence==saSequ)//on verifie que les sequences sont bien synchronisées

return;

saSequence=saSequ;

//System.out.println("in "+commandeReponse+"-"+paramReponse);

}





/**

* Reponse à la commande reçue

* @throws IOException -

*/

public synchronized void repondre() throws IOException{

if (commandeReponse == QUERY) {//si c'est une question

switch (paramReponse) {

case RULES:

envoie(ANSWER,JAPANESE);//on utilise les règles Japonaises

break;

case HANDICAP:

envoie(ANSWER,partie.getHandicap());

break;

case SIZE:

envoie(ANSWER,partie.getDimension());

break;

case COLOR:

envoie(ANSWER,partie.couleur);

break;

default :

envoie(ANSWER,0);

break;

}

}

else if (commandeReponse == ANSWER) {

envoieOK();

}

else if (commandeReponse == MOVE) {

envoieOK();

int move = paramReponse&0x1FF;

if (move!=0) {

int x=move%partie.getDimension();

int y=move/partie.getDimension()+1;

if (x==0) {

x=partie.getDimension();

y--;

}

partie.RecoitCoup(x,y);

}

else {

partie.RecoitCoup(0,0);//passe

}

}

else if (commandeReponse == OK) {

}

else envoieOK();



}



/**

* calculerChecksum

* @param b1 byte n°1

* @param b3 byte n°3

* @param b4 byte n°4

* @return la valeur du checksum

*/

public byte calculerChecksum(int b1, int b3, int b4) {

int cs = (b1&0x7F) + (b3&0x7F) + (b4&0x7F);

return (byte) (0x80 | cs);

}



/**

* Pour créer le premier byte de la réponse

* @param commande La commande de la réponse

* @param param Le paramètre de la réponse

* @return the returned byte

*/

private byte creerByte1Commande(int commande, int param) {

param = param&1023;

param = param>>7;

commande = commande<<4;

return (byte) (0x80 | commande | param);

}



/**

* Pour créer le deuxième byte de la réponse

* @param param le paramètre de la réponse

* @return the returned byte

*/

private byte creerByte2Commande(int param) {

param = param&127;

return (byte) (0x80 | param);

}



/**

* Envoyer une commande

* @param h Son bit de séquence

* @param y Notre bit de séquence

* @param commande La commande envoyée

* @param param Le paramètre de la commande

* @throws IOException -

*/

private synchronized void envoie(boolean h, boolean y, int commande, int param) throws IOException{

//System.out.println("out "+commande+"-"+param);

int byte1 = (h?1:0);

byte1 |= (y?2:0);

int byte3 = creerByte1Commande(commande, param)&255;

int byte4 = creerByte2Commande(param)&255;

int check = calculerChecksum(byte1, byte3, byte4);

out.write((byte) byte1);

out.write((byte) check);

out.write((byte) byte3);

out.write((byte) byte4);

out.flush();

}



/**

* envoyer un OK

* @throws IOException -

*/

public void envoieOK() throws IOException{

envoie(maSequence, saSequence, OK, 1023);

}



/**

* Envoie la commande et son paramètre

* @param commande Commande à envoyer

* @param param Paramètre de la commande

* @throws IOException -

*/

public void envoie (int commande, int param) throws IOException{

maSequence=!maSequence;

envoie(maSequence, saSequence, commande, param);

}



/**

* Envoie un mouvement (plutôt un placement)

* (1,1) : en bas à gauche -> (19, 19) en haut à droite

* @param couleur Couleur du joueur

* @param x Coordonnée du mouvement

* @param y Coordonnée du mouvement

* @throws IOException -

*/

public void envoieMouvement(int couleur, int x, int y) throws IOException{

int move = (y-1)*partie.getDimension() + x;

int c=0;

if (couleur == WHITE)

c=0x200;

envoie(MOVE, c|move);

}



/**

* Passer son tour

* @param couleur Couleur du joueur

* @throws IOException -

*/

public void passer(int couleur) throws IOException {

int c=0;

if (couleur == WHITE)

c=0x200;

envoie(MOVE, c);

}



}
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 11
4 janv. 2005 à 22:11
Bien jouer ;o) j avai pas penser a cette methode .. ;o)
comme quoi on peu toujour en apprendre ;o). A ma decharge :j avai jamais use la class Process ;o) mais c est en effet une solution tres simple a mettre en place ;o) si on controle le source du prog d en face ;o) car apres il suffi de jouer avec la sortie et l entree standard ...
Good ;o)

++

GodConan
0
Rejoignez-nous