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

NodeJS与终端进程交互:搭建Minecraft服务器WebUI的技术咨询

搭建Minecraft服务器WebUI的核心实现方案

一、后端核心:接管Minecraft进程的输入输出

后端的核心任务是启动并托管Minecraft Jar进程,实时捕获其输出流,同时支持向进程输入命令。以下是两种主流语言的实用实现:

Python 实现示例

借助subprocess管理进程,搭配Flask提供API接口:

import subprocess
from flask import Flask, Response, request

app = Flask(__name__)

# 启动MC服务器进程,配置管道式输入输出
mc_process = subprocess.Popen(
    ["java", "-Xmx2G", "-Xms1G", "-jar", "server.jar", "--nogui"],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,
    text=True,
    bufsize=1
)

# 实时读取服务器输出,以SSE格式返回给前端
def stream_logs():
    for line in iter(mc_process.stdout.readline, ''):
        yield f"data: {line}\n\n"

# 日志推送接口(SSE)
@app.route('/logs')
def logs():
    return Response(stream_logs(), mimetype='text/event-stream')

# 命令发送接口
@app.route('/command', methods=['POST'])
def send_command():
    cmd = request.form.get('cmd', '') + '\n'
    if cmd.strip():
        mc_process.stdin.write(cmd)
        mc_process.stdin.flush()
    return {'status': 'success'}

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Node.js 实现示例

用child_process模块配合Express框架:

const express = require('express');
const { spawn } = require('child_process');
const app = express();
app.use(express.urlencoded({ extended: true }));

// 启动MC服务器进程
const mcProcess = spawn('java', ['-Xmx2G', '-Xms1G', '-jar', 'server.jar', '--nogui'], {
    stdio: ['pipe', 'pipe', 'inherit']
});

// SSE实时推送日志
app.get('/logs', (req, res) => {
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');

    mcProcess.stdout.on('data', (chunk) => {
        res.write(`data: ${chunk.toString()}\n\n`);
    });

    req.on('close', () => res.end());
});

// 发送命令接口
app.post('/command', (req, res) => {
    const cmd = req.body.cmd.trim();
    if (cmd) mcProcess.stdin.write(`${cmd}\n`);
    res.json({ status: 'success' });
});

app.listen(3000, '0.0.0.0', () => {
    console.log('WebUI后端运行在3000端口');
});

二、前端实现:日志展示与命令交互

前端需要实现实时日志展示(自动滚动)和命令输入功能,以下是原生JS的极简示例:

<!DOCTYPE html>
<html>
<head>
    <title>MC服务器WebUI</title>
    <style>
        #log-panel {
            width: 100%;
            height: 450px;
            background: #1a1a1a;
            color: #f0f0f0;
            padding: 12px;
            overflow-y: auto;
            font-family: Consolas, monospace;
            line-height: 1.4;
        }
        #cmd-box {
            margin-top: 10px;
            display: flex;
            gap: 8px;
        }
        #cmd-input {
            flex: 1;
            padding: 8px;
            font-size: 14px;
        }
        #send-btn {
            padding: 8px 16px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div id="log-panel"></div>
    <div id="cmd-box">
        <input type="text" id="cmd-input" placeholder="输入命令,如 /list">
        <button id="send-btn">发送</button>
    </div>

    <script>
        const logPanel = document.getElementById('log-panel');
        const cmdInput = document.getElementById('cmd-input');
        const sendBtn = document.getElementById('send-btn');

        // 建立SSE连接接收实时日志
        const sse = new EventSource('/logs');
        sse.onmessage = (e) => {
            logPanel.textContent += e.data;
            logPanel.scrollTop = logPanel.scrollHeight; // 自动滚动到底部
        };

        // 发送命令逻辑
        const sendCmd = async () => {
            const cmd = cmdInput.value.trim();
            if (!cmd) return;
            await fetch('/command', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                },
                body: `cmd=${encodeURIComponent(cmd)}`
            });
            cmdInput.value = '';
        };

        sendBtn.addEventListener('click', sendCmd);
        cmdInput.addEventListener('keydown', (e) => {
            if (e.key === 'Enter') sendCmd();
        });
    </script>
</body>
</html>

三、关键注意事项

  • 权限配置:后端进程需拥有Minecraft服务器文件的读写权限,否则会启动失败。
  • 内存调整:启动Jar时的-Xmx/-Xms参数需根据服务器硬件配置调整,避免内存溢出。
  • 安全防护:若WebUI对外开放,必须添加身份验证(如Flask的flask-login、Express的passport),同时过滤恶意命令输入。
  • 进程守护:用systemd(Linux)或NSSM(Windows)托管后端服务,实现进程崩溃后的自动重启。

内容的提问来源于stack exchange,提问作者Titus Tesche

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:07:37