Komunikacja między engine'em

0

Otóż mam pewien engine w exe napisany w c++, który działa powiedzmy na zasadzie while(getline(cin,Line)), który wczytuje komendy, a silnik zwraca w cout jakieś tam odpowiedzi.
W jaki sposób najprościej obsłużyć w javie taki silnik?
Czyli w skrócie. Mój program w javie ma odpalić ten engine, wysłać do niego komendę, silnik zwróci odpowiedź, którą musi mój program odczytać.

Fajnie jakbyście misiaki dali jakiś poglądowy fragment kodu.

0

To CI rozwiąże sprawe


public class ProcessHelper {

    public ProcessHelper() {
    }

    public Process getProcess(String commandWithArgs, File workingDir) throws IOException {
        return Runtime.getRuntime().exec(commandWithArgs, null, workingDir);
    }

    public String bindRegularOutPut(Process proc) throws IOException {

        BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));        

        String wypis = "";
        String line;

        while ((line = input.readLine()) != null) {
            wypis = wypis + line;
        }
        input.close();

        if (!wypis.isEmpty())
        {
            return wypis;
        } else {
            return null;
        }

    }

    public String bindToErrorOutput(Process proc) throws IOException {
        BufferedReader error = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
        String wypis = "";
        String errorLine;

        while ((errorLine = error.readLine()) != null) {
            wypis = wypis + errorLine;
        }
        error.close();

        if (!wypis.isEmpty())
        {
            return wypis;
        } else {
            return null;
        }
    }

    public String executeCommand(String command, File workingDIr, boolean printErrorToLog) {
        try {
            Process currentProcess = getProcess(command, workingDIr);
            String wynik = bindRegularOutPut(currentProcess);
            if (wynik == null) {
                String blednyWynik = bindToErrorOutput(currentProcess);
                if (printErrorToLog) {
                }
                return null;
            }
            return wynik;
        } catch (Exception e) {
            if (printErrorToLog) {
            }
            return null;
        }
    }
0

EDIT: o, lipkerson edytował w międzyczasie i się spóźniłem :P

    private static Process exec(String command, String...args) throws IOException
    {
        return Runtime.getRuntime().exec("program.exe", args);
    }

    public static void main(String[] args) throws Exception
    {
        Process p = exec("program.exe", "argument 1", "argument 2");

        PrintWriter pw = new PrintWriter(p.getOutputStream());

        String komenda = "jakubie, zrób mi loda";

        pw.println(komenda);

        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));

        String cmd;
        while((cmd=br.readLine())!=null)
        {
            System.out.println("program dal komende:" + cmd);
        }
    }
0

Kerai, jeśli u mnie nie zrobię pw.close() przed whilem to nie działa.
Dlatego mam trochę problemy żeby to jakoś zapętlić.
Głowie się jak zrobić, żeby (np. z klawiatury) wpisywać polecenie, dostać odpowiedź i móc dalej wpisywać polecenia i tak w kółko. Czy trzeba to jakoś zamykać i otwierać ciągle?

0

Próbowałem nieskutecznie w taki prosty sposób:

Process p = Runtime.getRuntime().exec("engine.exe");
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader key = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(p.getOutputStream());
String line = null;

        while(true)
        {
            pw.print(key.readLine());
            //pw.close();
            while((line = in.readLine()) != null)
            {
                System.out.println(line);
            }
            //line = null;
        } [/code]

Bez pw.close(); nawet nie chce zadziałać. Działa tak że daje komendę, engine poprawnie odpowiada, dochodzi do ponownego podania komendy. Podaje ją, i while robi pusty przebieg nie dając żadnej odpowiedzi, a powinien.

0

import brain;

pw.println(key.readLine());
0
Kerai napisał(a)

import brain;

pw.println(key.readLine());

import brain niestety Tobie nie pomógł, bo nawet nie zbliżyłeś się tym do problemu, a co do rozwiązania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0