Javascript Node.JS:在接收标准输出数据后写入子进程spawn 我想做的事情:我编写了C++中的一个象棋引擎,我已经编译成一个可执行文件。我现在使用Node.JS让这个引擎与国际象棋网站的API通信(这样人类和其他引擎就可以挑战它)
我正在使用Node.JS的Javascript Node.JS:在接收标准输出数据后写入子进程spawn 我想做的事情:我编写了C++中的一个象棋引擎,我已经编译成一个可执行文件。我现在使用Node.JS让这个引擎与国际象棋网站的API通信(这样人类和其他引擎就可以挑战它),javascript,node.js,io,child-process,Javascript,Node.js,Io,Child Process,我正在使用Node.JS的child\u进程模块创建一个spawn,它将促进API和引擎之间的I/O通信 为了告诉引擎新游戏已经启动,我将“UCI\n”写入进程。然后,我等待引擎输出“id name{engine name}\r\nid author{my name}\r\nuciok\r\n”。从引擎收到此输出后,我需要将“isready\n”写回引擎,以便它以后可以开始生成移动 我的问题:我面临的问题是,在我最初的“UCI\n”写入进程之后,我调用child\u process.spawn(
child\u进程
模块创建一个spawn
,它将促进API和引擎之间的I/O通信
为了告诉引擎新游戏已经启动,我将“UCI\n”
写入进程。然后,我等待引擎输出“id name{engine name}\r\nid author{my name}\r\nuciok\r\n”
。从引擎收到此输出后,我需要将“isready\n”
写回引擎,以便它以后可以开始生成移动
我的问题:我面临的问题是,在我最初的“UCI\n”
写入进程之后,我调用child\u process.spawn().stdin.end()
。似乎这个end()
调用必须存在于某个地方,否则我的进程无法接收到我正在写入的输入
每当我在收到引擎的输出后尝试将“isready\n”
写入子进程时,我都会遇到以下错误:
错误[错误\u流\u结束后写入]:结束后写入
整个事情看起来像这样:
const engineExePath='C:\\Users\\chopi\\Desktop\\chess engine\\maestro\\uci.exe';
const childProcess=require('child_process');
const spawn_选项={
cwd:null,环境:null,分离:false
}
const engineStream=childProcess.spawn(engineExePath,[],spawn\u选项);
engineStream.stdout.on('data',函数(data){
var result=data.toString();
如果(结果='id name Maestro\r\nid作者dvdutch\r\nuciok\r\n'){
//在这里,我们正在收听引擎的响应,现在准备向它反馈一条消息。
//这就是发生错误的地方
engineStream.stdin.write('isready\n');
}否则{
console.log(“不匹配”);
}
});
engineStream.stdin.write('uci\n');
engineStream.stdin.end();
我尝试的内容:我尝试在子进程通过以下方式关闭其流时调用engineStream.stdin.end()
:
engineStream.on('close',(code)=>{
engineStream.stdin.end();
});
但是,当我这样做时,节点文件和子进程之间似乎没有任何通信便利,就像engineStream.stdin.end()
根本没有被调用一样。与此方法的整体集成如下所示:
const engineExePath='C:\\Users\\chopi\\Desktop\\chess engine\\maestro\\uci.exe';
const childProcess=require('child_process');
const spawn_选项={
cwd:null,环境:null,分离:false
}
const engineStream=childProcess.spawn(engineExePath,[],spawn\u选项);
engineStream.stdout.on('data',函数(data){
var result=data.toString();
如果(结果='id name Maestro\r\nid作者dvdutch\r\nuciok\r\n'){
//在这里,我们正在收听引擎的响应,现在准备向它反馈一条消息。
engineStream.stdin.write('isready\n');
}否则{
console.log(“不匹配”);
}
});
engineStream.on('关闭',(代码)=>{
engineStream.stdin.end();
});
engineStream.stdin.write('uci\n');
我想知道的是:
促进子进程和节点文件之间的消息乒乓的正确方法是什么?将
echo uci
发送到cmd
而不是发送到您的进程时,该方法是否有效?此外,数据
也不保证是行。输入被缓冲成块。运行uci.exe
,然后从cmd
键入echo uci
,不会返回任何内容。但是,我已经在chess引擎GUI上安装了引擎可执行文件(它通过GUI将用户的移动传递到引擎,并将用户的移动从引擎返回到用户),并且运行良好。很抱歉,我指的是节点生成cmd
,而不是uci.exe
。i、 e.检查另一个windows进程是否按照您希望的方式执行uci.exe
,或者从节点写入stdin是一个通用平台问题。从快速测试来看,它看起来像一个派生的cmd
可以在下一个js勾号上拾取输入,而无需使用.end()
您是对的,生成cmd.exe
并回显一些内容,监听回显,然后再次写入允许我多次写入。当然,这需要我删除engineStream.stdin.end()
。既然cmd.exe
可以很好地完成这项工作,我将研究为什么省略这一行会阻止uci.exe
将任何输出输出输出到我的节点文件。当将echo uci
发送到cmd
而不是发送到您的进程时,它会起作用吗?此外,数据
也不保证是行。输入被缓冲成块。运行uci.exe
,然后从cmd
键入echo uci
,不会返回任何内容。但是,我已经在chess引擎GUI上安装了引擎可执行文件(它通过GUI将用户的移动传递到引擎,并将用户的移动从引擎返回到用户),并且运行良好。很抱歉,我指的是节点生成cmd
,而不是uci.exe
。i、 e.检查另一个windows进程是否按照您希望的方式执行uci.exe
,或者从节点写入stdin是一个通用平台问题。从快速测试来看,它看起来像一个派生的cmd
可以在下一个js勾号上拾取输入,而无需使用.end()
您是对的,生成cmd.exe
并回显一些内容,监听回显,然后再次写入允许我多次写入。当然,这需要我删除engineStream.stdin.end()