【问题标题】:Cannot send commands using output stream无法使用输出流发送命令
【发布时间】:2012-05-01 13:02:21
【问题描述】:

我正在尝试编写一个小型 Java 应用程序,让我可以使用 Java Process/ProcessBuilder API 在屏幕外运行 Bukkit 服务器。

我能够很好地从服务器获取输出,但服务器不响应由Process.getOutputStream()(链接到进程输入流)返回的输出流写入的命令。

我尝试使用我自己的测试代码执行此操作,并且成功了。从System.in 读取的单独进程接收到写入输出流的文本。

Bukkit 不听System.in 什么的吗? 如果不是,那怎么可能? 有什么想法吗?

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

【问题讨论】:

    标签: java process cmd bukkit


    【解决方案1】:

    我不认为 Bukkit 使用它的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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多