0

netcat を使用して udp ポート フォワーダーをテストしていますが、宛先 (netcat リスナー サブプロセス) からプログラムで文字列を読み取ることができません。メッセージがリスナーに正しく転送されたかどうかを確認するために netcat リスナー サブプロセスから読み取る正しいストリームは何ですか? 現在、リスナーサブプロセスの INPUT STREAM から読み取っていますが、これを機能させるのに問題があります。Process.getInputStream() は実際には親プロセスの入力ストリームであり、サブプロセスの stdout に対応することを読みましたが、おそらくこれは取得するストリームが間違っているのでしょうか??

最初に、UDP ポート フォワーダー サブプロセスを開始します。これにより、localhost:srcPort に着信するものはすべて localhost:destPort に転送されます。

次に、netcat リスナーを 2 つの「ドレイン」スレッドと共に開始します。1 つはリスナー サブプロセスのエラー ストリームから読み取り、もう 1 つはその入力ストリームから読み取ります。

Process recvProcess = Runtime.getRuntime().exec("nc -luv -p <destPort>");


次に、netcat センダーを開始して、ポート フォワーダーに文字列を送信し、2 つのドレイン スレッドを送信します。

Process sendProcess = Runtime.getRuntime().exec("nc -vu <srcHost> <srcPort>");


最後に、文字列を送信します。

String sendString = String.format("hello%s", System.lineSeparator());
PrintWriter sendWriter = new PrintWriter(sendProcess.getOutputStream());
sendWriter.print(sendString);
sendWriter.flush();


代わりに cmd ウィンドウから netcat リスナーを実行すると、sendString がコンソールに正しく出力されます。しかし、私の Java プログラムからは、リスナーの inputStream ブロックの読み取りが行われます。リスナーの inputStream 読み取りスレッドの run() メソッドは次のとおりです。

BufferedReader in;
try {
    in = new BufferedReader(new InputStreamReader(receiveMsgProcess.getInputStream()));
    String receivedMsg;
    while ((receivedMsg = in.readLine()) != null) {
        System.out.println(String.format("RECV IN: %s", receivedMsg));
    }
} catch (...) { ... }

改行の問題かもしれないと思ったので、in.readLine() の代わりに in.ready() および in.read(buffer, 0, 1024) メソッドを使用してみました。それらはすべてブロックします。

また、listner の出力をファイルにリダイレクトしようとしました。

Runtime.getRuntime.exec("nc -luv -p <destPort> > recvMsg.txt");

しかし、これも機能せず、ファイルは作成されません。

助けてください。私は、netcat と Java プロセス ストリームについて何かを誤解しているだけだと確信しています。提案や洞察をお寄せいただきありがとうございます。

4

1 に答える 1

1

nc コマンドの出力の errorStream を読み取ります。

StringBuffer response = new StringBuffer();
BufferdReader reader = new BufferedReader(new InputStreamReader(recvProcess.getErrorStream()));
String line="";
while ((line = reader.readLine())!= null) {
    response.append(line + "\n");
}
System.out.println(response.toString());
于 2016-02-08T10:50:47.547 に答える