所以我从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);
}
}
出于某种原因,它不起作用。我不确定我是否错过了一步,或者正在寻找某些东西等等。任何帮助都将不胜感激!
答案 0 :(得分: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();
}
P.S你不再需要在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
}