0

所以我正在从 GUI 启动一个 Bukkit (Minecraft) 服务器。

ProcessBuilder builder = new ProcessBuilder();
builder.redirectErrorStream(true);
builder.command("java", "-jar", file.getAbsolutePath());

try {
    p = builder.start();
    input = new BufferedReader(new InputStreamReader(p.getInputStream()));
    output = new DataOutputStream(p.getOutputStream());
} catch (IOException e) {
    Logger.logError(e);
    return;
}

没有错误,服务器本身正确启动。输入流也可以正常工作,因为我应该得到所有输入。现在,我有这种方法可以向服务器发送命令。

public void send(String message) {
    try {
        output.writeUTF(message + "\n");
        output.flush();
    } catch (IOException e) {
        Logger.logError(e);
    }
}

但由于某种原因,它不起作用。我不确定我是否错过了一步,或者正在查看某些内容等。任何帮助将不胜感激!

4

1 回答 1

1

我怀疑 DataOutputStream 正在以非常规方式向 OutputStream 写入数据,请尝试改用 PrintWriter 对象。

考虑一下:

try {
    p = builder.start();
    input = new BufferedReader(new InputStreamReader(p.getInputStream()));
    output = new PrintWriter(p.getOutputStream());
} catch (IOException e) {
    Logger.logError(e);
    return;
}


发送方法:

public void send(String message) {
    output.println(message);
    output.flush();
}

PS 你不再需要在 output.println() 周围的 try-catch,因为 PrintWriter 的 print 和 println 方法不会抛出 IOException。

从 bukkit 的插件角度来看(如果您不知道这是什么,请阅读我的评论):

final JavaPlugin Inst = ... //This plugin's object

try(BufferedReader Reader = new BufferedReader(new InputStreamReader(System.in, Charset.forName("UTF-8")))){
    while((Line = Reader.readLine()) != null){
        final String L = Line;
        Bukkit.getScheduler().runTask(Inst, new Runnable(){
            @Override
            public void run() {
                 Bukkit.dispatchCommand(Bukkit.getConsoleSender(), L);
            }
        });
    }
}catch(IOException ex){
    //Handle this
}
于 2013-09-04T18:47:54.517 回答