如何在Node.js中向Spawn启动的Java子进程发送命令
向Java子进程发送命令的实现方案
核心思路
通过Node.js子进程对象的stdin.write()方法,将命令写入Java进程的标准输入(stdin)——大多数控制台Java程序默认会从标准输入读取命令。
步骤修正与实现
1. 修正前端命令获取的错误
你的test函数存在两处API使用错误,先修正:
document.getElementsById应为document.getElementById(单数形式,不存在getElementsById这个API)- 获取输入框内容应使用
.value而非.innerHTML(输入框的用户输入内容存储在value属性中)
2. 实现命令发送逻辑
在修正后的test函数中,通过子进程的stdin.write()发送命令,注意必须添加换行符\n——Java程序通常以换行作为命令输入的结束标记,否则会一直等待输入完成。
子进程启动代码(确保child变量可被test函数访问)
const { spawn } = require('child_process'); // 将child声明为全局变量,或放在test函数可访问的作用域内 var child; // Start child process child = spawn('java', ['-server', '-Xms1G', `-Xmx${document.getElementById('ram').value}G`, `-jar`, `${jarname}`], { cwd: `${jarfolder}` }); child.stdout.on('data', (data) => { $("ol").append(`<li>${data}</li><br>`); }); child.stderr.on('data', (data) => { $("ol").append(`<li>${data}</li><br>`); }); child.on('error', (error) => console.log(`error: ${error.message}`)); child.on('exit', (code, signal) => { if (code) $("ol").append(`<li>Process exit with code: ${code}</li><br>`); if (signal) $("ol").append(`<li>Process killed with signal: ${signal}</li><br>`); });
修正后的test函数
function test(){ // 正确获取输入框中的命令内容 var command = document.getElementById("command").value; // 检查子进程是否存活且标准输入可写,然后发送命令 if (child && child.stdin.writable) { child.stdin.write(command + '\n'); // 可选:发送后清空输入框 document.getElementById("command").value = ''; } }
关键注意点
- 作用域问题:必须保证
child变量在test函数的作用域内可访问,比如声明为全局变量,或通过闭包、模块导出等方式传递 - 换行符必要性:Java控制台程序一般按行读取输入,没有
\n的话程序会一直等待输入结束的信号 - 状态检查:通过
child.stdin.writable判断子进程是否还存活,避免子进程已退出时触发写入错误
内容的提问来源于stack exchange,提问作者HEALER
相关产品推荐
相关产品推荐

