【发布时间】:2014-07-31 15:36:29
【问题描述】:
我正在使用 Java Process API 编写一个类,该类从网络接收二进制输入(例如通过 TCP 端口 A),对其进行处理并将二进制输出写入网络(例如通过 TCP 端口 B)。我正在使用 Windows XP。代码看起来像这样。有两个函数称为run() 和receive():在开始时调用一次run,而只要通过网络接收到新的输入,就会调用receive。运行和接收是从不同的线程调用的。
run进程启动一个exe并接收exe的输入输出流。 Run 还会启动一个新线程,将 exe 的输出写入端口 B。
public void run() {
try {
Process prc = // some exe is `start`ed using ProcessBuilder
OutputStream procStdIn = new BufferedOutputStream(prc.getOutputStream());
InputStream procStdOut = new BufferedInputStream(prc.getInputStream());
Thread t = new Thread(new ProcStdOutputToPort(procStdOut));
t.start();
prc.waitFor();
t.join();
procStdIn.close();
procStdOut.close();
} catch (Exception e) {
e.printStackTrace();
printError("Error : " + e.getMessage());
}
}
receive 将接收到的输入从端口 A 转发到 exe。
public void receive(byte[] b) throws Exception {
procStdIn.write(b);
}
class ProcStdOutputToPort implements Runnable {
private BufferedInputStream bis;
public ProcStdOutputToPort(BufferedInputStream bis) {
this.bis = bis;
}
public void run() {
try {
int bytesRead;
int bufLen = 1024;
byte[] buffer = new byte[bufLen];
while ((bytesRead = bis.read(buffer)) != -1) {
// write output to the network
}
} catch (IOException ex) {
Logger.getLogger().log(Level.SEVERE, null, ex);
}
}
}
问题是我在receive() 中得到了以下堆栈,然后prc.waitfor() 立即返回。行号显示堆栈正在写入 exe。
The pipe has been ended
java.io.IOException: The pipe has been ended
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:260)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:109)
at java.io.FilterOutputStream.write(FilterOutputStream.java:80)
at xxx.receive(xxx.java:86)
对此的任何建议将不胜感激。
【问题讨论】: