Komunikacja z zewnętrznym programem

Odpowiedz Nowy wątek
2008-12-28 20:33
kihoo
0

Witam,
mam następujący problem.

Załóżmy, że piszemy prosty program jako frontend do zewnętrznej aplikacji konsolowej w systemie linux.
W klasie przechowujemy wskazanie na process
Process p=Runtime.getRuntime().exec("external_ap");
Jak również jego wejście/wyjście

stdInput=new BufferedReader(new InputStreamReader(p.getInputStream()));
stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
stdOutput=new DataOutputStream(p.getOutputStream());

Chcemy wyświetlić wszystko, co wyrzuca zewnętrzna aplikacja:

while((line=stdInput.readLine())!=null){
System.out.println(line);
}

Wszystko na razie gra. Mój problem pojawia się, gdy w procesie zewnętrznym pojawia się dialog z użytkownikiem, niech będzie to oczekiwanie na liczbę. Wtedy aplikacja zawiesza się w pętli.
Szukam wskazówki, jak można obsłużyć to tak, żeby dialog z użytkownikiem przenieść na własną aplikację. Czyli, jeśli pojawi się oczekiwanie na dane wprowadzone przez użytkownika, program wychodzi z pętli i obsługuje zdarzenie.

Za wszelkie uwagi - serdecznie dziękuję :)

Pozostało 580 znaków

2008-12-31 12:50
0

Moim zdaniem rozwiązaniem tego problemu jest interaktywne parsowanie wyjścia programu zewnętrznego po to, żeby móc na wejście tego procesu podać oczekiwane przez niego dane. Zadziała to oczywiście jeżeli wejście i wyjście jest buforowane wierszowo lub znakowo (dynamicznie), a nie zadziała jeżeli przekierowanie jest zrealizowane za pomocą plików tymczasowych (czyli buforowania obejmującego całość wejścia i całość wyjścia).
Głównym problemem jest rozpoznanie oczekiwania na wejście - czyli rozpoznania pytania procesu zewnętrznego. Jeżeli zachęty do wprowadzenia danych kończą się zawsze dwukropkiem, albo znakiem pytajnika i nie ma ich w żadnych innych tekstach wyjściowych tego procesu, to sprawa jest dość oczywista. Należy wtedy wyrzucić własne zapytanie ze sparsowanym z wyjścia tego procesu tekstem, wczytać ciąg znaków i podać na wejście procesu zewnętrznego. Jeżeli dane będą złe, to proces ten zapewne o tym poinformuje, co również należy sparsować, przekazać do własnego dialogu do użytkownika i ponowić wczytywanie danych w ten sam sposób.
Im bardziej rozbudowana jest interakcja procesu zewnętrznego, tym trudniej będzie to wykonać.


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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