如果我不关闭流,与exe通信后会阻止java println
我目前正在将GUI连接到UCI国际象棋引擎。为此,我使用以下方法创建引擎流程:如果我不关闭流,与exe通信后会阻止java println,java,stream,exe,communication,println,Java,Stream,Exe,Communication,Println,我目前正在将GUI连接到UCI国际象棋引擎。为此,我使用以下方法创建引擎流程: try { process = Runtime.getRuntime().exec(enginePath); } catch (IOException e) { System.err.println("ENGINE NOT FOUND"); e.printStackTrace(); } 我确信我能打开引擎 当发动机打开时,没有从发动机输出的有效流。为了启动通信,我必须向引擎发送特定命令。引擎将响应
try {
process = Runtime.getRuntime().exec(enginePath);
} catch (IOException e) {
System.err.println("ENGINE NOT FOUND");
e.printStackTrace();
}
我确信我能打开引擎
当发动机打开时,没有从发动机输出的有效流。为了启动通信,我必须向引擎发送特定命令。引擎将响应然后。。。因此,它是以命令/响应方式工作的,在打开时不会立即流式传输数据,或者在没有人说话的情况下说话。为了通信,我有一个发送消息块。在此块中,使用其outputstream向引擎写入消息,并使用其standart输入流获取输入,如以下发送方法所示:
private String sendCommand(String command) {
stdin = new PrintWriter(new OutputStreamWriter(process.getOutputStream()));
BufferedReader inputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader errReader = new BufferedReader(newInputStreamReader(process.getErrorStream()));
String answer = "";
stdin.println(command);
stdin.flush();
stdin.close();
try {
String line = "";
while ((line = inputReader.readLine()) != null) {
System.out.println(line);
answer = line;
}
inputReader.close();
} catch (IOException ioe) {
System.err.println("READ ERROR");
ioe.printStackTrace();
}
try {
String line = "";
while ((line = errReader.readLine()) != null) {
System.err.println(line);
}
errReader.close();
} catch (IOException ioe) {
System.err.println("READ ERROR");
ioe.printStackTrace();
}
return answer;
}
顺便说一句,整个引擎在一个单独的线程中工作,而不是在主GUI线程中。因此,GUI没有重载。但是,我没有在单个线程中分离stdin stderr和output方法,因为我假设只有stdin和我将写入引擎的stdin。目前我认为它们不会碰撞
通过这些代码,我能够与发动机通信,并且可以在控制台中看到输出。但是由于标准关闭;在出现流关闭错误时,我只能在几秒钟内使用此方法一次。国际象棋引擎需要在打开时以命令/响应方式进行多次通信,每次都不重新启动exe。问题是,如果我删除该行:stdin.close;是,通信继续,但我的控制台被此通信阻止。也就是说,我不能再出于调试目的将LN打印到控制台。这非常关键,因为我的主要调试工具是system.out.println。如果我不删除标准,请关闭;我必须重新启动可执行文件,每次我想发送消息,我不希望这样**奇怪的是,由于System.out.printlnline,我可以在控制台中看到来自引擎的消息;发送方法中的行;但是,一旦代码退出该方法,我就无法在控制台上打印任何内容**
编辑:实际上在该块之后:
while ((line = inputReader.readLine()) != null) {
System.out.println(line);
answer = line;
}
System.out.println开始不工作
编辑:问题似乎不在于println,而在于while循环之后的任何语句
根据这一点,似乎因为流从未关闭,而循环被卡住了。实际上,当在while循环内部打印时,在流结束后的某个点,打印停止,这必须指示while循环结束。因此,如果它完成了,它应该在下一个语句中继续,不是吗?无论如何,来自引擎的消息在每个流的末尾都有一组字符串;因此,当我遇到其中一个,我打破了while循环
注:有趣的是:将数据累积为:receivedString+=行;不起作用,即数据未累积。为了修复它,我幸运地使它receivedString=receivedString+line+\n;而且成功了。。我不知道为什么。您正在读取输入,直到流结束,所以它不会停止读取,直到流结束。在这种情况下,流结束意味着对等方已关闭连接。在流程退出之前,流程的输出或错误流不会发生这种情况。您必须找到其他一些循环终止条件,或者在单独的线程中使用stdout和stderr