0

我正在使用 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 流的东西。提前感谢您的任何建议或见解。

4

1 回答 1

1

读取错误流以获取 nc 命令的输出。

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 回答