2013-01-03 38 views
0

我不能爲我的生活弄清楚如何使用Java中的兩個按鈕來啓動和停止遊戲Minecraft的服務器。控制檯命令Minecraft服務器通過Java GUI啓動/停止

到目前爲止,我有這個爛攤子..

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」。

非常感謝您的幫助,我非常感謝。

+0

1)通過去[當的Runtime.exec ()不會](http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html)&落實建議。 2)這是Swing嗎? 3)對於每個'catch'調用'exception.printStackTrace();' –

+0

@AndrewThompson 1)這似乎基本上是通過一次運行一個命令流並且不允許再次附加到流X時間後運行另一個命令。 2)你是什麼意思「搖擺?」 3)我做到了,沒有任何反應。 –

+0

1)我不明白。你是否實施了這些建議,是或否? 2)什麼類型是'stop_Btn'?它是AWT,SWT,JSP,Swing ..? 3)好的 - 沒有明顯的例外情況,但是消耗並顯示進程的「err」流,並在編輯中顯示新代碼,最好是[SSCCE](http://sscce.org/)。 –

回答

0

看到好像從來沒有一個答案解決了我的問題,並且看到好像我自己想出來的那樣,我想我會將它發佈給所有其他人發生的問題。

我使用幾個類來實現這個目標,兩個是確切的。一個是容納服務器和另一個向服務器發送命令的線程。

首先,代碼來啓動和容納服務器流。

先到這裏類是在魔術發生

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

這是我寫的,從我的世界的服務器控制檯流寫我自己的GUI類,這個代碼不是很重要,所以我會離開它。您可以編寫該部分。

  • 的execute()

此方法構建使用Java的的ProcessBuilder然後啓動過程中的服務器的過程。更重要的是,我們擁有StreamGobbler ..這使我們可以訪問服務器的輸入流並「吞噬」輸入流。基本上它從服務器接收所有輸出控制檯。出於某種原因,不知道爲什麼,Minecraft服務器喜歡ErrorStream,所以我已經將它綁定到了這一點。然後,我爲狼吞虎嚥創建一個新的線程,就是這樣。在這種方法中最後一件事是...

  • PrinterWriter

這綁定到服務器作爲輸出,讓我將命令發送到服務器等,用於停止,或真的任何其他服務器可用的命令。

  • StreamGobbler類

現在,到gobbler之自身。這裏沒有太多。基本上只是將我們從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 Server Utility(BETA)1.3.6

0

我今天正在處理這個相同的任務。我是java的新手,但我想我找到了你可能錯過的東西。 我或多或少地跟隨了你的領先優勢,但在停止命令中使用了斜槓"/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(); 
    } 

}    

我希望這可以幫助你。