Minecraft /节点-写入process.stdin和子进程也接收输入

时间:2019-02-03 20:12:13

标签: node.js minecraft

我正在尝试编写一个终端应用程序,该应用程序将允许我启动和停止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进程的输出。但是到第二次迭代,什么都没有。

1 个答案:

答案 0 :(得分:0)

您无法写入process.stdin。您是要写《 Minecraft》流程mincraft.stdin的标准输入吗?

minecraft.stdin.write(line)