我正在尝试编写一个终端应用程序,该应用程序将允许我启动和停止Minecraft服务器,通过readline编写参数,该参数将首先由Node进程检查,然后如果由脚本确定,则发送给Minecraft服务器代替。
在具有最新Node构建和Minecraft JE服务器的Windows 10上运行。
首先,我测试了仅启动一个节点进程,该节点进程在持有Minecraft服务器的子进程中产生。我将3个stdio参数设置为“ inherit”和“ ipc”(不确定100%为什么这样做是必要的,但我看到其他人也这样做了)。运行后,如果我在终端中输入任何内容,Minecraft服务器将通过Node接收输入。太好了不过,我想要的是能够运行readline并解析输入,并确定Node是否应该处理输入,或者是否应该将其发送到Minecraft服务器。
所以我玩弄了stdio参数,并使用了process.stdin.write()之类的方法,试图弄清楚如何写入子进程的stdin,以便Minecraft服务器能够接收输入,但无济于事
因此,我尝试运行一个“主”节点进程,该进程将派生一个辅助节点进程。 “主”将运行readline,并使用child.send()(如果要在此处发送任何输入)。然后,在第二个Node进程中,我将启动Minecraft服务器,将所有3个stdio参数设置为继承。然后,我将使用process.on('message')进行侦听,如果收到了一条消息,请将其写入process.stdin,希望Minecraft进程将通过继承的输入接收到它。但这也不起作用。
我尝试了许多不同的方法,但是最后我没有任何运气。我已经尝试过尽可能多地查找,但是没有找到任何可以帮助我的东西。抱歉,这真是明智之举。
// First Iteration
// spawns in a minecraft server and listens for input in the terminal
// effectively the same as running the equivalent run command for the minecraft server, except this runs as a Node child process
const spawn = require('child_process').spawn
var minecraft = spawn('java', ['-jar', '-Xms1G','-Xmx1G', '-Dfile.encoding=utf8', '../spigot-1.13.2.jar'], {
stdio: [
'inherit',
'inherit',
'inherit',
'ipc'
],
})
// Second Iteration
// changed cp stdin to pipe and tried to write manually via rl
const spawn = require('child_process').spawn
const readline = require('readline')
var minecraft = spawn('java', ['-jar', '-Xms1G','-Xmx1G', '-Dfile.encoding=utf8', '../spigot-1.13.2.jar'], {
stdio: [
'pipe',
'inherit',
'inherit',
'ipc'
],
})
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
}).on('line',(line)=> {
process.stdin.write(line)
})
// Later iterations involved running nested child processes, basically, but were all more or less more-abstract versions of my second iteration.
正如我之前所说,我想要实现的是能够通过readline侦听来自终端的管理员输入,并将该输入适当地发送到Minecraft服务器进程。否则,将在Node进程中处理readline输入。
**是为了澄清,当我说它不起作用时,我的意思是我的Minecraft服务器进程没有响应。游戏中什么都没有,命令行上什么也没有。在我的第一次迭代中,我可以在游戏中和命令行中看到Minecraft进程的输出。但是到第二次迭代,什么都没有。
答案 0 :(得分:0)
您无法写入process.stdin
。您是要写《 Minecraft》流程mincraft.stdin
的标准输入吗?
minecraft.stdin.write(line)