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

C Discussion :

Communication avec un programme java


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut Communication avec un programme java
    Bonjour !

    J'ai besoin d'un coup de main pour réaliser un petit programme.
    Mon but est de créer une petite application en C qui me permettra de "gérer" un programme java.
    Le programme C devra lancer le programme en java et lui transmettre des commandes. J'ai fait quelques recherches, je sais comment lancer le programme mais je ne trouve pas comment faire pour lui transmettre les intructions.

    A l'heure actuelle, le programme java est lancé via un .bat.
    Les commandes que je rentre dans la console ouverte par le .bat sont transmises au programme java, c'est ce mode de fonctionnement que je voudrai reproduire dans le programme C.

    Je précise: je ne peux pas modifier le programme java qui n'est pas de ma conception.


    Pour ceux qui veulent plus de détails:

    En fait, je veux créer un programme pour gérer un serveur minecraft.
    Le serveur minecraft est en fait un fichier .jar (minecraft_server.jar).
    Mon objectif en créant un programme en C est de pouvoir lancer le serveur (actuellement lancé via un .bat) et surtout de pouvoir faire une sauvegarde de la carte régulièrement, ce qui nécessite d'envoyer un "save-all" au serveur pour que la sauvegarde soit bien à jour.

    Je prends toutes les suggestions qui pourraient m'aider à avancer (y compris, si c'est possible, je prends les solutions en java)^^.

    Merci.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Pour communiquer tu as :
    les sockets, les tubes voir même la mémoire partagée.
    Et peut être aussi les détournement de clavier/souris

    Après, ça dépend de l'utilisation que tu en feras.

    Mais dans ton cas, lancer le.jar se fait assez facilement (system("start ...."))
    Et pour les sauvegardes régulières, pourquoi ne pas laisser le programme java les faire lui-même?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Hé bien justement, comme je l'ai dit le programme java n'est pas de ma conception et il ne fait pas les sauvegardes automatiques !
    C'est pour ça que j'ai besoin de lui envoyer une commande pour qu'il sauvegarde l'état actuel du serveur, pour ensuite en faire une copie en lieu sûr.

    Les sockets, les tubes, la mémoire partagée et les détournements de clavier souris, pourquoi pas, mais on fait comment ? ^^"

    J'aurai peut être dû préciser que je suis plutôt débutant ^^

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Les sockets, les tubes, la mémoire partagée
    Ca va être très compliqué sans avoir la main sur le code java !!!
    les détournements de clavier souris
    Regarde du côté des hook et API d'accessibilité (pur java)
    pour la comm java <=> c++, tu as JNI.
    tout ça n'est pas évident.

    bon courage.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ton .bat contient la commande Java complète non ? Quelque chose comme java -jar minecraft_server.jar -option1 -option2 ? Tu as essayé de faire un appel à la commande system() avec comme paramètre cette commande Java ?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Bktero, comme je le disais dans le premier message j'arrive à lancer le serveur, via system("blablabla"); de ce côté là ça va.

    Le problème, c'est pour envoyer le "save-all" par exemple toutes les heures pour que le serveur sauve la map dans les fichiers et ensuite faire une copie de ces fichiers pour avoir une save en cas de plantage du serveur (plus ou moins fréquent sur minecraft, et parfois la map est irrécupérable).

    Bref, il faut que je puisse envoyer un "save-all" au serveur régulièrement.

    mala92, ok je prends note, et j'irai me renseigner là dessus.
    Ca me parait quand même bizarre qu'il soit si difficile de communiquer avec un processus lancé par l'application elle même, mais visiblement c'est comme ça...

    Quoiqu'il en soit, si quelqu'un à d'autres idées à proposer, je reste à l'écoute !

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Autant pour moi ! J'ai interprété la phrase suivante :
    comment faire pour lui transmettre les intructions.
    comme "je n'arrive pas à lui transmettre les options". Pardon.

    Ton .bat contient les commandes pour déclencher la sauvegarde ? On peut avoir un aperçu de ce fichier ou est-il confidentiel ?

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Imaginons un instant que tu n'es pas dans ton programme C, mais que tu lances ton programme Java a la main. Une fois qu'il est lance, comment fais-tu pour lui passer les commandes que tu veux ? Via une interface graphique ? Via un .bat ? Autrement ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    @Bktero:

    Le .bat ne me sert qu'à lancer le serveur.
    Cela dit, c'est vrai que je n'ai pas envisagé la possibilité de faire ceci via le .bat lui même... mais j'ai un doute, est-il possible de faire un .bat capable "d'attendre" pendant une heure pour faire la sauvegarde ? mon but n'est pas de faire monter le proco à 100%, mais juste de faire une sauvegarde du serveur toute les heures.

    Contenu du .bat:
    "C:\Program Files\Java\jre6\bin\java.exe" -Xmx2048M -Xms1024M -jar minecraft_server.jar
    pause
    @gangsoleil:

    Un screenshot vaut mieux que 1000 mots:



    Si vous regardez bien, vous verrez le RUN.bat dans l'explorateur, c'est ce .bat dont j'ai donné le contenu un peu plus haut.
    Il y a aussi le minecraft_server.jar qui est le programme que je veux "contrôler".
    L'invite de commande est ouverte par le .bat, et la troisième fenêtre c'est le serveur lui même. Le champ où l'on tape les commandes normalement c'est là où j'ai écrit "ici c'est le champ \"normal\" pour les instructions serveurs".
    Mais si vous regardez dans l'invite de commande, j'ai tapé "list" et "save-all" et le serveur a reçu ces instructions comme si je les avais tapées directement dans le champ du serveur (alors que je les ai tapées dans la fenêtre de l'invite de commande).

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    C'est déjà beaucoup plus clair comme ça Je pensais que le fichier .bat contenait aussi les ordres de sauvegarde, c'est pour cette raison que je te demandais ce qu'il contenait. Si tu ne peux pas modifier le programme Java, la solution me semble de définir l'entrée standard de ton jar non plus comme étant le clavier mais comme étant le programme C. Sous Linux, je pourrais arriver à quelque chose avec les pipes, mais sous Windows je n'ai pas d'idée. Je vais donc laisser mon tour à des meilleurs que moi ^^

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Ok, merci quand même Bktero ^^

    @ les meilleurs que lui: j'vous attends impatiemment :p

  12. #12
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Si je ne dis pas de bêtise, sous windows comme sous Linux, un programme hérite des entrée/sortie de son père.

    Pour ton programme C, tu créé un tube.
    Ensuite tu fait un fork
    Dans le processus fils, tu défini la sortie du tube comme entrée standard
    Puis tu fait un recouvrement avec execp

    Après, je dois avouer que j'ai jamais tenté sous windows

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Je rappelle que je suis débutant, donc "créer un tube" et "faire un fork", c'est obscure pour moi.

    Tu dis de définir la sortie du tube comme entrée standard du processus fils, je schématise l'idée sans problème mais pour ça il faut avoir accès au code source du programme fils non ?

  14. #14
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    En fait tu as un programme.

    tu fait un fork()

    A ce moment là, ton processus se divise en deux processus.
    Le fils et le père partagent le même code source.
    Le fils a une copie des variables du père

    fork() renverra -1 en cas d'erreur, 0 pour le fils et le pid du fils pour le père.
    Donc généralement on fait un switch

    Et dans le code du fils, tu met la sortie du tube sur l'entre standart, et tu fait un recouvrement avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    execp("chemin_programme", "nom_programme", "argument_1", "argument_2", ...., NULL);
    Pour les tubes, cherche la fonction pipe();

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Ok j'prends note de tout ça et j'vais aller me renseigner sur le fork() parce que je pense que je le comprends pas bien pour l'instant. Tel que le comprends actuellement, ça fait un clone de mon programme, or ce que je veux c'est lancer un autre programme, pas une seconde instance du premier.

    Bref, j'vais avoir quelques man à lire vu que ces concepts sont nouveaux pour moi.

    En attendant, la question du premier message reste ouverte, à savoir: comment envoyer des commandes à un programme java depuis un autre programme, sans avoir accès au code source du programme java.

    Je reste à l'écoute si quelqu'un à d'autres solutions à proposer.

  16. #16
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Lors du fork, ton fils est un clone mais comme tu fait un recouvrement, le fils est recouvert par le programme que tu veux lancer.

    Après pour envoyer tes commandes, tu n'as qu'à les mettre dans le tube.

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Ah oui, c'est tout bête mais pas con !

    Ok, j'vais essayer ça, merci beaucoup !

    J'vous tiens au courant si j'arrive à faire ce que je veux, le sujet reste ouvert et non résolu en attendant.

    EDIT: s'aurai été trop beau que ça marche du tac au tac ^^.
    Visiblement la fonction fork() n'existe pas pour windows, mais à la place c'est CreateProcess ou CreateThread qui sont semble-t-il beaucoup plus compliquées à manipuler...
    Bref, je perds pas espoir, j'espère juste pouvoir faire la même chose, donc créer un nouveau process ou thread et pouvoir le recouvrir avec mon programme java en ayant créer les tunnels pour communiquer entre eux...

  18. #18
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Neckara, je ne comprend pas le principe de fonctionnement de ta solution. Comment, en forkant un processus C et en utilisant un tube en le processus père en C et le processus fils en C, communiques-tu avec le programme Java ?

    Mon idée était d'utiliser un pipe pour chaîner les commandes au lancement. Pendant mon précédent message, j'ai fait un essai sous Ubuntu :
    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
    ::::::::::::::
    ecrivain.c
    ::::::::::::::
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
    	printf("%s", argv[1]);	
    	return 0;
    }
    ::::::::::::::
    lecteur.c
    ::::::::::::::
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
    	char *chaine = malloc(100*sizeof(char));
    	if(chaine != NULL)
    	{
    		scanf("%s",chaine);
    		printf("L'ecrivain a transmis : %s\n", chaine);	
    		return 0;
    	}
    	else
    		return 1;
    }
    Je compile mes deux exécutables et je les lance ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $> ./ecrivain "helloItsBktero" | ./lecteur
    L'ecrivain a transmis : helloItsBktero
    Cette technique a 2 soucis :
    1. Le pipe | ne semble pas exister sous Windows --> l'utilisation de Cygwin pourrait peut-être résoudre cela.
    2. Une telle redirection fonctionne t-elle dans le cas d'une IHM ? Si oui, il faut être sûr que le champ d'invite de commande du serveur soit sélectionné par défaut, pour ne pas avoir à le cliquer manuellement après lancement des programmes.

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Telle que j'ai compris l'idée de neckara, il s'agit de faire un fork() pour créer un processus fils, mettre en place les tubes entre le père et le fils et ensuite de "recouvrir" le fils avec le programme java. Donc, si ça fonctionne comme je le comprends, en prenant la place du processus fils, le programme java verrai son entrée et sa sortie reliée aux tubes, donc reliées au processus père.

    Le problème, c'est qu'il n'y a pas de fork() sous windows ^^".
    (Et visiblement pas d'exec() non plus)

    Après les quelques recherches que j'ai fait, je suis retombé plusieurs fois sur cette page: http://msdn.microsoft.com/en-us/library/ms682499.

    En tant que débutant j'ai du mal à comprendre donc j'avance doucement dans l'assimilation de ce code, mais apparemment il permet de lancer un autre programme en ayant un tube vers son entrée et un autre vers sa sortie, donc ça ressemble à ce que je cherche, mais il va me falloir un peu de temps pour assimiler et utiliser ce code.

    Enfin, Bktero, ta solution n'est utilisable que sous unix puisque le pipe | n'existe pas sous windows.
    Je sais que je suis quand même assez exigeant sur les contraintes que je m'impose, mais je me dis que quitte à vouloir programmer, autant apprendre le plus possible et faire ça le plus proprement possible ^^.

  20. #20
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Squall124 Voir le message
    Telle que j'ai compris l'idée de neckara, il s'agit de faire un fork() pour créer un processus fils, mettre en place les tubes entre le père et le fils et ensuite de "recouvrir" le fils avec le programme java. Donc, si ça fonctionne comme je le comprends, en prenant la place du processus fils, le programme java verrai son entrée et sa sortie reliée aux tubes, donc reliées au processus père.
    Oula je viens de relire et j'ai compris




    Citation Envoyé par Squall124 Voir le message
    Enfin, Bktero, ta solution n'est utilisable que sous unix puisque le pipe | n'existe pas sous windows.
    C'est pour cette raison que je te propose d'utiliser Cygwin

    Cygwin te permet d'avoir une console semblable à celle d'Unix, avec des commandes Unix, et donc sûrement des pipes (je n'ai pas testé), sous Windows

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/08/2008, 14h40
  2. Souci JDBC avec Mysql, programmation JAVA
    Par Danzel dans le forum Windows
    Réponses: 8
    Dernier message: 29/12/2006, 21h46
  3. Souci JDBC avec Mysql, programmation JAVA
    Par Danzel dans le forum JDBC
    Réponses: 1
    Dernier message: 16/12/2006, 09h31
  4. JSmooth avec des programmes Java conséquents...
    Par phyll dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 28/04/2006, 10h25
  5. [votre avis m'interesse] Interface avec un programme Java
    Par LineLe dans le forum Interfaces Graphiques en Java
    Réponses: 29
    Dernier message: 11/12/2004, 11h39

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