You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:45:29