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 プロセス ストリームについて何かを誤解しているだけだと確信しています。提案や洞察をお寄せいただきありがとうございます。