我怎么也想不出如何使用 Java 中的两个按钮来启动和停止 Minecraft 游戏的服务器。
到目前为止,我的情况一团糟..
try
{
ProcessBuilder processBuilder = new ProcessBuilder("/Users/UserName/Desktop/servers/test/launch.sh");
Process server;
if (event.getSource() == start_Btn)
{
server = processBuilder.start();
//OutputStream out = server.getOutputStream();
start_Btn.setText("Started");
}
else if (event.getSource() == stop_Btn)
{
OutputStream out = server.getOutputStream();
server.getOutputStream().write(new String("stop").getBytes("utf-8"));
stop_Btn.setText("Stoped");
start_Btn.setText("Start");
}
}
catch (IOException exception)
{
}
catch (InterruptedException exception)
{
}
今天我在网上搜索了一整天,我决定终于把它带给你们了。
我希望能够通过按“启动”按钮启动服务器,然后用“停止”按钮停止服务器我设置了 GUI,并且知道如何设置按钮事件。我可以轻松地通过启动按钮启动服务器,这只是我似乎无法管理的停止功能。
注意:要停止服务器,您必须在启动服务器的命令行中输入“stop”。
非常感谢您的帮助,非常感谢。
最佳答案
似乎从来没有一个答案可以解决我的问题,而且似乎是我自己想出来的,我想我会将其发布给所有其他发生在该问题上的人。
我使用几个类来实现这个目标,确切地说是两个。一个是容纳服务器的线程,另一个是向服务器发送命令的线程。
首先,启动和容纳服务器流的代码。
这里的第一个类是魔法发生的地方
public class Sender{
ConsoleWriter cWriter = new ConsoleWriter();
public void execute(){
this.ui = ui;
try{
ProcessBuilder pb = new ProcessBuilder(path_to_server+"launch.bat");
Process process = pb.start();
StreamGobbler sgError = new StreamGobbler(process.getErrorStream());
new Thread( sgError ).start();
writer = new PrintWriter( process.getOutputStream() );
} catch ( IOException e ){
e.printStackTrace();
}
}
private class StreamGobbler implements Runnable
{
private InputStream is;
public StreamGobbler( InputStream is ){
this.is = is;
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader( is );
BufferedReader br = new BufferedReader( isr );
String line = null;
while ( ( line = br.readLine() ) != null ){
cWriter.writer(line, ui);
}
} catch ( IOException e ){
e.printStackTrace();
}
}
}
}
您问这是如何工作的?让我们从顶部开始。
- 控制台编写器
这是我编写的类,用于将 Minecraft 的服务器控制台的流写入我自己的 GUI,其代码并不重要,因此我将其省略。你可以写那部分。
- 执行()
此方法使用 Java 的 ProcessBuilder 为服务器构建进程,然后启动该进程。更重要的是,我们有 StreamGobbler。这使我们能够访问并“吞噬”来自服务器的输入流。基本上它从服务器接收控制台的所有输出。由于某种原因(不确定为什么),Minecraft 服务器喜欢 ErrorStream,所以我将其绑定(bind)到它。然后我为 gobbler 创建一个新线程,仅此而已。此方法中的最后一件事是...
- 打印机作家
这作为输出绑定(bind)到服务器,让我可以向服务器发送命令,例如停止它或任何其他可用的服务器命令。
- StreamGobbler 类
现在,我们来看看 Gobbler 本身。这里就不多说了。基本上只是将我们从执行方法发送的 inputStream 发送到读取器,然后对其进行缓冲,最后将其读取到我的控制台编写器。
第二个类非常简单!
public class WriteCommand
{
public void send(String command)
{
txtA.append("Command:>>"+ command + "\n");
writer.write(command);
writer.write("\n");
writer.flush();
}
}
这一切所做的就是编写命令并按“回车”,然后刷新它以准备发送下一个! txtA.append 用于添加发送到我自己的控制台输出的命令,只是一个可视项。
就这样吧!希望这会帮助其他人。 如果您想查看此代码的实际效果,您可以将其视为我使用它的应用程序的一部分。
关于java - 通过 Java GUI 控制台命令 Minecraft 服务器启动/停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14134669/