使用 JavaScript 或 PHP 的游戏服务器的实时控制台 input/output

Live console input/output for a gameserver using JavaScript or PHP

一般信息: 我在地下室有一个 Minecraft 服务器 运行 供一些朋友使用 运行 几个月了。我们使用 TeamViewer 将命令输入控制台并在服务器 运行 时查看可能的错误。 Minecraft 服务器的控制台基本上会向您显示带有时间戳的事件日志以及底部的命令输入行,使您能够以管理员权限执行游戏中的命令。

控制台通过批处理文件启动:

:startup
@echo off
set v1=6
cls
Java -Xmx%v1%G -jar spigot.jar nogui
goto startup

spigot.jar文件是基本上运行服务器的文件。

因为我们管理着多台服务器,而且 TeamViewer 进程非常不安全而且速度很慢,所以我想找到其他方式来访问控制台。

目标: 我想创建一个使用 JavaScript 或 PHP 与服务器控制台通信的 HTML 网络界面。它应该能够显示实时控制台日志,并能够在浏览器中键入命令,然后在服务器的命令行中执行这些命令。

问题:

我想你可以在这样的网站上显示日志:

第一个游戏服务器脚本:

:startup
@echo off
set v1=6
cls
Java -Xmx%v1%G -jar spigot.jar nogui > log.txt
fileup log.txt
goto startup

第二个游戏服务器脚本(称为 fileup.bat){如果您的 php 服务器,请将我的用户名、我的密码和 servername.com 替换为凭据}:

@echo off
echo user MyUserName> ftpcmd.dat
echo MyPassword>> ftpcmd.dat
echo bin>> ftpcmd.dat
echo put %1>> ftpcmd.dat
echo quit>> ftpcmd.dat
ftp -n -s:ftpcmd.dat SERVERNAME.COM
del ftpcmd.dat

php-服务器端脚本:

<?php
$filename = "log.txt";
$fp = fopen($filename, "r");

$content = fread($fp, filesize($filename));
$lines = explode("\n", $content);
fclose($fp);
print_r($lines);
?>

顺便说一下:我没有测试过任何这些脚本,它们可能不起作用,我只是基于我对 php 和批处理的了解。此外,第二个批处理脚本需要与第一个批处理脚本位于同一目录中,您不必 运行 第二个批处理脚本

注意: 我是一个经验丰富的 PHP 用户,但我对批处理不太了解(我使用 linux),但我想这会起作用,而且我过去经常使用批处理。此外,我建议在来自 000webhost.com 或 infinityfree.net 的外部托管 php 服务器上使用 PHP 脚本,因为它们是免费的并且可以节省您很多时间 + 它们拥有所有需要的东西ftp 预先配置的东西。

如果这有效,请告诉我

我肯定会建议将您的设置移到 Windows 环境之外,因为您可以更轻松地在 Linux 中托管 PHP 服务器等] 环境。

诚然,我对 MineCraft 不熟悉,但看起来您拥有的批处理文件实际上只是启动一个 Java JAR,这可以从任何安装了 JRE 的计算机上完成。 Java 控制台应用程序在进程的 STDIN 上读取输入,并在 STDOUT 上读取任何应用程序生成的输出。这在 Ubuntu 环境中非常容易上手。

例如,假设您在全新 Ubuntu 安装中安装了标准 LAMP 堆栈。 PHP 用于 运行 服务器端进程,Apache 用于托管您决定构建的任何 Web 界面。关注前端与后端,我可能会尝试使用 Slim 或其他轻量级框架在 PHP 中设置一个 API。在用于启动服务器的 API 端点中,它看起来像这样:

exex('screen -d -m -S ServerOne');    
exec('screen -S ServerOne -p 0 -X stuff "java -Xmx%v1%G -jar spigot.jar nogui > /some_path_to_log^M"');

第一个 exec() 将创建一个名为 "ServerOne" 的屏幕会话,您的服务器进程可以在其中 运行。第二个 exec() 将发送在屏幕会话中启动服务器进程所需的命令。实际上,这将 运行 您的服务器异步到您的 PHP 脚本并将输出写入指定路径。知道在哪里期望输出,在您用来获取日志的 API 端点中,您会得到类似的东西:

$logContent = file_get_content('/some_path_to_log'); 

最后,在您用来向服务器写入命令的 API 端点中,您将拥有如下内容:

exec('screen -S ServerOne -p 0 -X stuff "<your_command_here>^M"');

这将写入服务器 Java 进程的 STDIN 流,反过来,应该将其解释为就好像您实际上是在控制台本身的键盘上打字一样。

这就是它的基础知识,或者至少是我要开始的地方。您可以使用 WebSockets 做一些非常酷的事情来为您的服务器控制台打开实时 I/O 会话,但它比这个 post 涉及更多。如果您有兴趣,请查看 Ratchet for PHP or ws 以获得 Node.js。

考虑 this ServerFault post 以获取有关将输入发送到屏幕会话的更多信息。