2013-01-03 1 views
0

을 통해 중지합니다.콘솔 명령 마인 크래프트 서버 시작/나는 내 인생 습니 자바에서 두 개의 버튼을 사용하여 게임 마인 크래프트의 서버를 중지 시작하는 방법을 알아낼 수 없습니다 자바 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가 설정 한 "정지"버튼으로 정지 할 수 있도록하려면 내가 버튼 이벤트를 설정하는 방법을 알고있다. 서버를 시작 버튼으로 쉽게 시작할 수 있습니다. 관리 할 수없는 중지 기능 일뿐입니다.

참고 : 당신이 입력해야 서버를 중지하려면 서버가 시작된 명령 줄에서 "중지".

는 당신의 도움을 주셔서 감사합니다, 나는 대단히 감사.

+0

1)을 통해 이동 [때 Runtime.exec의()는 (http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html) & 권장 사항을 이행하지 않습니다. 2)이 스윙인가? 3) 각 catch (catch) 호출에 대해 exception.printStackTrace(); –

+0

@AndrewThompson 1)이 명령은 한 번에 하나의 명령 스트림을 실행하고 스트림에 다시 연결할 수는 없지만 X 시간 후에 실행됩니다. 다른 명령. 2) "스윙"이란 무엇입니까? 3) 나는 그것을했고 아무 일도 일어나지 않는다. –

+0

1) 이해가 안됩니다. 당신은 권고를 구현 했습니까, 예 또는 아니오? 2)'stop_Btn'은 어떤 타입입니까? 그것은 AWT, SWT, JSP, Swing ..입니까? 3) OK - 분명한 예외는 없지만 프로세스의'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로 마인 크래프트의 서버 콘솔에서 스트림을 작성 쓴 클래스이며,이에 대한 코드 그래서 나는 그것을 밖으로 떠날거야 중요하지 않습니다. 그 부분을 쓸 수 있습니다.

  • 실행()

이 방법은 자바의 ProcessBuilder를 다음 과정을 시작하여 서버의 프로세스를 구축합니다. 더 중요한 것은, 우리는 StreamGobbler가 있다는 것입니다. 이것은 우리에게 서버로부터의 입력 스트림에 대한 액세스를 제공하고 입력 스트림을 '상쇄 (gobbles up)'시킵니다. 기본적으로 모든 출력을 서버에서 수신합니다. 왠지 이유는 모르겠지만, Minecraft 서버는 ErrorStream을 좋아해서 그것에 바인딩했습니다. 그렇다면 나는 고 블러를위한 새로운 스레드를 만들고 그게 전부입니다.이 방법의 마지막 것은입니다 ...

  • PrinterWriter

이 날을 정지와 같은 서버에 명령을 보내거나 정말 다른 서버 명령을 사용할 수 있도록 출력으로 서버에 결합 .

  • StreamGobbler 클래스 이제

의 블러 위에 자체. 여기 너무 많지 않습니다. 기본적으로 우리가 보낸 execute 메소드에서 보낸 inputStream을 독자에게 보낸 다음 버퍼링하고 마지막으로 내 콘솔 작성자에게 읽습니다.

두 번째 클래스는 매우 간단합니다!

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

이 모든 명령을 작성 후 다음을 보낼 준비를 세척 '입력'타격하고있다! txtA.append는 내 콘솔 출력으로 보낸 명령을 단순히 시각적 인 항목으로 추가하기위한 것입니다.

그리고 거기에 가세요! 바라기를 이것은 누군가 다른 사람을 도울 것입니다. 당신은 행동이 코드를보고 싶은 경우 당신은 내가 그것을 사용했던 응용 프로그램의 일부로 볼 수 있습니다 여기에

는 링크입니다. Minecraft Server Utility(BETA)1.3.6

0

오늘 나는이 같은 작업을 수행하고있었습니다. 나는 자바에서 초보자이지만 당신이 놓칠지도 모르는 것을 발견했다고 생각한다. 나는 어느 정도 당신의 리드를 따라 갔다.하지만 스톱 명령에서 슬래시를 사용한다. "/stop"

또한 작업 완료를 위해 outputstream을 닫아야 할 것으로 보인다.

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

}    

이 정보가 도움이되기를 바랍니다. 나는 내 자신에 그것을 알아 낸 것처럼