包装java程序';s标准输入/标准输出

包装java程序';s标准输入/标准输出,java,python,minecraft,Java,Python,Minecraft,我正在为流行的游戏minecraft编写一个服务器管理工具 这个游戏及其服务器应用程序是用java编写的。服务器只是一个从终端启动的jar,它接受来自stdin的输入作为命令并输出到stdout。(在java-jarserver.jar的行中) 现在我要做的是围绕这些java进程创建某种包装(python中的atm,我也可以使用java)并创建一个API来管理它们(发送命令、重新启动、检查进程是否仍在运行等等)。我需要这个API,这样我就可以为整个事情创建一个web前端。一个物理服务器将运行这些

我正在为流行的游戏minecraft编写一个服务器管理工具

这个游戏及其服务器应用程序是用java编写的。服务器只是一个从终端启动的jar,它接受来自stdin的输入作为命令并输出到stdout。(在java-jarserver.jar的行中)

现在我要做的是围绕这些java进程创建某种包装(python中的atm,我也可以使用java)并创建一个API来管理它们(发送命令、重新启动、检查进程是否仍在运行等等)。我需要这个API,这样我就可以为整个事情创建一个web前端。一个物理服务器将运行这些java进程的多个实例(多个游戏服务器),因此我不希望在这里有太多开销

我尝试过使用python的子进程,但这会阻止程序完成,然后输出标准输出内容,但我需要它返回live。我也遇到过Pexpect(),但这似乎更像是一个自动化测试工具包。

使用

Runtime.getRuntime().exec("your sever start command or script")
获取进程的实例

通过该实例,您可以使用

InputStreamReader(process.getInputStream()), 
并将字节发送到它的stdin

process.getOutputStream().write("your commannd\n".getBytes()); 

记住刷新ostream以执行命令

RCON不允许您发出远程服务器命令吗?“别再发明轮子了。”乔克:那可能是真的,我得调查一下,谢谢。但这还不能完全解决我的问题。我想通过web界面动态创建新的服务器实例。这也意味着我需要在服务器端启动新的进程,这是RCON不允许的。最后一点你是对的。据我所知,RCON只是连接到一个正在运行的服务器实例并与之交互。使用它至少可以减少一些需要做的工作。Java程序可以在多个线程中使用Java.lang.Process并发运行多个子进程,并且可以重定向子进程的stdin、stdout和stderr。总之,这不是一项简单的任务。