2010-11-29 17 views
2

私はこのプロジェクトで私の目的はJavaでリモートコマンドプロンプトを感じることでした。 TCP/IPソケットを使用して、私はあるコンピュータでコマンドプロンプトプロセスを実行し、すべてのコントロールを仮想的に相手側に送信することを目指していました。私はすぐにRuntime.getRuntime()。exec()とProcessオブジェクトなどを見つけた。私は途中で問題を解決した。リモートコマンドプロンプトを使用すると、1つのコマンドを実行して出力を収集し、それを相手側に返すことができます。問題は、コマンドプロンプトインスタンスごとに1つのコマンドだけを実行するように見えることです。これはしません(ディレクトリを変更してコマンドを実行する必要がある状況など)。私はこの状況からすべてのソケット/ネットワーキングプログラミングを取り除いたことが分かりました(私にとってはより簡単なテスト環境を作るために)。Javaで完全にCMD.exeプロセスの入出力/エラーストリームをリダイレクト

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」の後に別のコマンドを送ることができます。

出力ストリームを収集してリダイレクトしました。 (それはerrorStream ORたInputStreamからなるかどうか)、私はこれを使用することができるようにしたい

processOut.write("net user"); 

コマンドプロンプトでコマンドを実行していて、出力を保持します。私のような何かを行うことができるようにしたいです。

これを行う方法については、今後の方向性が必要です。

+0

私はスレッドでもプログラムする方法を知っていますので、必要ならばそれを実行できます。 – theifyppl

答えて

1

マルチスレッドを調べる必要があります。あなたが基本的に望むのは、実行し続けているスレッドです。このよう

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

マルチスレッディングの更なる参考: http://download.oracle.com/javase/tutorial/essential/concurrency/procthread.html

あなたの問題は、プログラムが1回の呼び出し後に終了していることです。

歓声

1

あなたはコマンドインタープリタに終了を指示しています。 cmd.exeの後に/ Cを削除します。

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 
... 
関連する問題