繁体   English   中英

控制台命令Minecraft Server通过Java GUI启动/停止

[英]Console Commands Minecraft Server Start/Stop Through Java GUI

我一辈子都想不通如何使用Java中的两个按钮为游戏《我的世界》启动和停止服务器。

到目前为止,我很混乱。

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();
        }
    }
}

}

您如何要求这项工作? 让我们从顶部开始。

  • ConsoleWriter

这是我编写的类,用于将Minecraft的服务器控制台中的流写入我自己的GUI,此代码并不重要,因此我将其省略。 您可以编写该部分。

  • 执行()

该方法使用Java的ProcessBuilder为服务器构建进程,然后启动该进程。 更重要的是,我们拥有StreamGobbler。这使我们可以访问并“吞噬”来自服务器的输入流。 基本上,它从服务器接收控制台的所有输出。 由于某些原因(不确定原因),Minecraft服务器喜欢ErrorStream,所以我将其绑定到了它。 然后,我为火鸡创建一个新线程,就是这样。 这种方法的最后一件事是...

  • 打印机书写器

这作为输出绑定到服务器,让我将命令发送到服务器,例如停止它或其他任何可用的服务器命令。

  • StreamGobbler类

现在,将其自身放在狼人身上。 这里不要太多。 基本上,只是使用我们从execute方法发送的inputStream,将其发送到读取器,然后对其进行缓冲,最后将其读取到我的控制台编写器。

第二类很简单!

public class WriteCommand
{
public void send(String command)
{
    txtA.append("Command:>>"+ command + "\n");
    writer.write(command);
    writer.write("\n");
    writer.flush(); 
}
}

所有这些操作就是编写命令并单击“ enter”,然后刷新它以准备发送下一条! txtA.append用于添加发送到我自己的控制台输出的命令,只是一个可视项。

然后你去! 希望这可以帮助其他人。 如果您想查看此代码的运行情况,可以将其作为我使用过的应用程序的一部分。

这里是一个链接: Minecraft服务器实用程序(BETA)1.3.6

我今天正在从事同一任务。 我是Java的新手,但我认为我发现了您可能缺少的内容。 我或多或少遵循了您的指导,但是在stop命令中使用斜杠"/stop"

似乎我也需要关闭输出流才能完成操作。

private void stopButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
    // TODO add your handling code here:
    try {
        oS.write(new String("/stop").getBytes("utf-8"));
        oS.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}               

希望对您有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM