Minecraft / Node - Запись в process.stdin и дочерний процесс также получает ввод - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь написать терминальное приложение, которое позволило бы мне запускать и останавливать сервер Minecraft, записывать аргументы через readline, которые сначала проверялись бы процессом Node, а затем, если это определено сценарием, отправлялись в Minecraftвместо этого используется сервер.

Работает в Windows 10 с последней сборкой Node и сервером Minecraft JE.

Сначала я проверил, как только запускается процесс узла, который порождался в дочернем процессе, содержащем сервер Minecraft.,Я установил 3 аргумента stdio как «наследовать», а также «ipc» (не уверен на 100%, почему это необходимо, но я видел, как это делают другие).После запуска, если я наберу что-нибудь в терминал, сервер Minecraft получит вход через Node.Это было здорово.Однако я хотел, чтобы у меня была возможность запускать readline и анализировать входные данные и определять, должен ли Node обрабатывать входные данные или их следует отправлять на сервер Minecraft.

Поэтому я поигрался с аргументами stdio ииспользуя process.stdin.write () и т. д., пытаясь выяснить, как записать в stdin дочернего процесса, чтобы сервер Minecraft получал входные данные, но безрезультатно.

Поэтому я попытался запустить«основной» процесс узла, который будет форкировать вторичный процесс узла.«Мастер» запускает readline и использует child.send (), если какой-либо вход должен быть отправлен туда.Затем, во втором процессе Node, я запускаю сервер Minecraft как spawn со всеми 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 как в игре, так и в командной строке.Но по второй итерации ничего.

1 Ответ

0 голосов
/ 04 февраля 2019

Вы не можете писать на process.stdin.Вы хотели написать в стандартный поток процесса Minecraft mincraft.stdin?

minecraft.stdin.write(line)
...