node.js - Minecraft/Node - 写入 process.stdin 且子进程也接收输入

标签 node.js minecraft

我正在尝试编写一个终端应用程序,它允许我启动和停止 Minecraft 服务器,通过 readline 写入参数,该参数首先由 Node 进程检查,然后,如果由脚本确定,则发送到 Minecraft 服务器以供使用。

在具有最新 Node 版本和 Minecraft JE 服务器的 Windows 10 上运行。

首先,我测试了仅启动一个 Node 进程,该进程在持有 Minecraft 服务器的子进程中生成。我将 3 个 stdio 参数设置为“继承”和“ipc”(不是 100% 确定为什么这是必要的,但我看到其他人这样做)。运行后,如果我在终端中输入任何内容,Minecraft 服务器将通过 Node.js 接收输入。这太棒了。不过,我想要的是能够运行 readline 并解析输入,并确定 Node 是否应该处理输入或者是否应该将它们发送到 Minecraft 服务器。

因此,我尝试使用 stdio 参数并使用 process.stdin.write() 等,试图找出如何写入子进程的 stdin 以便 Minecraft 服务器接收输入,但无济于事。

所以我尝试运行一个“主” Node 进程来派生一个辅助 Node 进程。 “master”将运行 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 服务器进程。否则,readline 输入将在 Node 进程中处理。

** 澄清一下,当我说它不起作用时,我的意思是我没有从 Minecraft 服务器进程得到任何响应。游戏中没有任何内容,命令行上也没有任何内容。在我的第一次迭代中,我可以在游戏中和命令行上看到 Minecraft 进程的输出。但到了第二次迭代,什么也没有了。

最佳答案

您无法写入process.stdin。您的意思是写入minecraft进程的stdin mincraft.stdin吗?

minecraft.stdin.write(line)

关于node.js - Minecraft/Node - 写入 process.stdin 且子进程也接收输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54507103/

相关文章:

node.js - Node JS Dust 不会渲染新行

JavaScript(node.js) - 异步等待不起作用

java - Minecraft 插件 scheduleSyncDelayedTask 错误

java - NPE on plugin.getConfig().set(... , ...);

c++ - 帮助使用 perlin 噪声库 libnoise

java - 将外部 jar 添加到 ModCoderPack (MCP)

node.js - Node-sass 不会在最新的 node/express 中自动编译

mysql - 具有 MySQL 连接的 Nodejs 集群

node.js - 测试存储库代码时出现的问题(Node JS、webpack)

java - 使用java来操作minecraft服务器输入/输出