2010-11-29 7 views
2

Моя цель с этим проектом состояла в том, чтобы получить удаленное командное сообщение с Java. Используя сокеты TCP/IP, я стремился запустить процесс командной строки на одном компьютере и фактически передать все элементы управления другой стороне. Я сразу наткнулся на Runtime.getRuntime(). Exec() и объекты Process и т. Д. Я решил проблему примерно наполовину. С помощью моей команды удаленной команды я могу запустить одну команду, собрать выход и отправить его обратно на другую сторону. Проблема в том, что я могу только запустить одну команду на экземпляр командной строки. Этого не будет (с ситуациями, когда мне нужно сменить каталог и THEN запустите команду и т. Д.). Я отключил все сокет/сетевое программирование из этой ситуации, чтобы показать вам (и создать для меня более легкую среду тестирования).Перенаправление потоков ввода/вывода/ошибок процесса CMD.exe Полностью с Java

import java.io.*; 


public class testingProgram { 

public static void main(String[] args) { 

    Runtime rt = Runtime.getRuntime(); 
    StringBuilder inputMessage = new StringBuilder(); 
    String resultData; 
    try { 

    Process pr = rt.exec("cmd.exe /c net user"); 
    BufferedReader processInput = new BufferedReader(new InputStreamReader(pr.getInputStream())); 
    BufferedReader errorProcessInput = new BufferedReader(new InputStreamReader(pr.getErrorStream())); 
    PrintWriter processOut = new PrintWriter(pr.getOutputStream()); 
    while((resultData = processInput.readLine()) != null) { 
     inputMessage.append(resultData + "\n"); 
    } 
    resultData = inputMessage.toString(); 
    System.out.print(resultData); 
    } catch(IOException e) { 

    } //catch(InterruptedException e) { 

    //} 
} 

} 

У меня есть намного больше, но это - то, где моя проблема. Я могу настроить команду «net user» с помощью простой переменной и сообщения из сокета, так что это не моя проблема. Моя проблема в том, что мне нужно создать текущий экземпляр командной строки, сохраняя все перенаправления ввода/вывода. В принципе, я хотел бы иметь возможность отправить еще одну команду ПОСЛЕ «net user».

Я собрал и перенаправил выходной поток. Я хочу быть в состоянии сделать что-то вроде:

processOut.write("net user"); 

Я хочу, чтобы иметь возможность использовать это, есть в командной строке выполнить команду, и сохранить выход (будь то из errorStream ИЛИ в InputStream).

Мне просто нужно еще какое-то направление относительно того, как это сделать.

+0

Я знаю, как программировать с помощью Threads, поэтому, если это необходимо, я могу это сделать. – theifyppl 2010-11-29 06:22:58

ответ

1

Вы должны изучить многопоточность. То, что вы в основном хотите, это поток, который продолжает работать и поддерживает rt.

Как это:

String commandLine; 
    while ((commandLine = System.in.readline()) != 'q') { 
     Process pc = rt.exec(commandLine); 
    } 

Для дальнейшей ссылки на многопоточности: http://download.oracle.com/javase/tutorial/essential/concurrency/procthread.html

Вы проблема заключается в том, что ваша программа завершается после того, как один вызов.

веселит

1

Вы хотите сказать, интерпретатор команд, чтобы прекратить. Удалите/c после cmd.exe.

cmd /? 
Starts a new instance of the Windows command interpreter 

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF] 
    [[/S] [/C | /K] string] 

/C  Carries out the command specified by string and then terminates 
/K  Carries out the command specified by string but remains 
... 
Смежные вопросы