2012-04-19 4 views
2

Java Process/ProcessBuilder API를 사용하여 Bukkit 서버를 실외에서 실행할 수있는 작은 Java 응용 프로그램을 작성하려고합니다.출력 스트림을 사용하여 명령을 보낼 수 없습니다.

서버에서 출력을 올바르게 가져올 수 있지만 서버가 Process.getOutputStream() (프로세스 입력 스트림에 연결됨)에 의해 반환 된 출력 스트림에 의해 작성된 명령에 응답하지 않습니다.

내 테스트 코드로이 작업을 시도했지만 효과가있었습니다. System.in에서 읽는 별도의 프로세스가 출력 스트림에 기록 된 텍스트를 수신했습니다.

부킷은 System.in 또는 다른 것을 듣지 않습니까? 그렇지 않다면 어떻게 될 수 있습니까? 아이디어가 있으십니까? 내가 Bukkit을 생각하지 않는다

try { 
    ProcessBuilder pb = new ProcessBuilder(); 
    File dir = new File("C:/Users/Brian/Desktop/MC-Server/Bukkit-Testing"); 
    pb.directory(dir); 
    pb.command(new String[] {"java", "-Xincgc", "-Xmx1G", "-jar", "craftbukkit-1.0.1-R1.jar"}); 
    pb.redirectErrorStream(true); 
    final Process p = pb.start(); 
    InputStream out = p.getInputStream(); 
    BufferedReader r1 = new BufferedReader(new InputStreamReader(out)); 
    String s = null; 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
      Scanner scan = new Scanner(System.in); 
      String input = null; 
      while((input=scan.nextLine()) != null) { 
       if(input.equals("exit")) { 
        p.destroy(); 
        break; 
       } 
       try { 
        bw.write(input); 
        bw.flush(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    }).start(); 
    while((s=r1.readLine()) !=null) 
     System.out.println(s); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

답변

3

System.in를 사용하기 때문에 우리는 해결 방법을 확인해야합니다.

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.util.logging.Logger; 

import org.bukkit.Bukkit; 
import org.bukkit.plugin.java.JavaPlugin; 

public class ConsolePlugin extends JavaPlugin { 

    public Logger log; 

    public void onEnable(){ 
     log = this.getLogger(); 
     log.info("BufferedReader has been enabled!"); 
     new Thread(new Runnable(){ 
      public void run(){ 
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
       String line = null; 
       while (true){ 
        try { 
         line=br.readLine(); 
        } catch (Exception e) {e.printStackTrace();} 
        if (line!=null){ 
         Bukkit.dispatchCommand(Bukkit.getConsoleSender(), line); 
         System.out.println(line); 
        } 
       } 
      } 
     }).start(); 
    } 

    public void onDisable(){ 
     log.info("BufferedReader has been disabled."); 
    } 
} 

보내려면 명령 :

bw.write(input); 
bw.nextLine(); 
bw.flush(); 
관련 문제