Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.JS:在接收标准输出数据后写入子进程spawn 我想做的事情:我编写了C++中的一个象棋引擎,我已经编译成一个可执行文件。我现在使用Node.JS让这个引擎与国际象棋网站的API通信(这样人类和其他引擎就可以挑战它)_Javascript_Node.js_Io_Child Process - Fatal编程技术网

Javascript Node.JS:在接收标准输出数据后写入子进程spawn 我想做的事情:我编写了C++中的一个象棋引擎,我已经编译成一个可执行文件。我现在使用Node.JS让这个引擎与国际象棋网站的API通信(这样人类和其他引擎就可以挑战它)

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(

我正在使用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().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()