我正在使用 netcat 测试 udp 端口转发器,并且无法以编程方式从目标(netcat 侦听器子进程)读取字符串。从我的 netcat 侦听器子进程读取消息是否正确转发到侦听器的正确流是什么?目前,我正在从侦听器子进程的 INPUT STREAM 中读取内容,但无法使其正常工作。我已经读过 Process.getInputStream() 实际上是父进程的输入流,并且对应于子进程的标准输出,但也许这是错误的流?
首先,我启动我的 udp 端口转发器子进程,它将把 localhost:srcPort 上的任何内容转发到 localhost:destPort。
接下来,我启动了一个 netcat 侦听器以及两个“耗尽”线程——一个从侦听器子进程的错误流中读取,一个从其输入流中读取。
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.ready() 和 in.read(buffer, 0, 1024) 方法而不是 in.readLine()。他们都挡住了。
我还尝试将我的列表器的输出重定向到一个文件:
Runtime.getRuntime.exec("nc -luv -p <destPort> > recvMsg.txt");
但这也不起作用,没有创建文件。
请帮忙,我很确定我只是误解了一些关于 netcat 和 java Process 流的东西。提前感谢您的任何建议或见解。