您好,我想向正在运行的 Minecraft 服务器发送命令并观察它的响应。 一切正常,但服务器启动后我无法发送任何命令:
这是我的代码:
import java.io.*;
import java.util.Scanner;
public class Server{
private String name;
private StartCommand command;
private boolean on = false;
private Process p = null;
public Server(StartCommand c, String name){
this.command = c;
this.name = name;
}
public String getName(){
return name;
}
public void start(){
try {
p = Runtime.getRuntime().exec(command.getCommand());
System.out.println("Server: " + name + " is on now!");
on = true;
} catch (IOException e) {
e.printStackTrace();
on = false;
}
}
public void watch(){
System.out.println("threads:");
Thread t1 = new Thread(new proc1(p));
Thread t2 = new Thread(new proc2(p));
System.out.println("start1");
t1.start();
System.out.println("start2");
t2.start();
}
}
//-----Processes-----//
class proc1 implements Runnable{
private Process p;
private static String line = null;
public proc1(Process p){
this.p = p;
}
@Override
public void run(){
try{
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
//on = false;
}
}
}
class proc2 implements Runnable{
private Process p;
public proc2(Process p){
this.p = p;
}
@Override
public void run(){
Scanner in = new Scanner(System.in);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
//OutputStream out = p.getOutputStream();
System.out.println("start while (type commands now!!!!)");
while(in.hasNextLine()){
String command = in.nextLine();
if(command.equals("ext")){
//coming soon
return;
}else{
try{
out.write(command);
out.flush();
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}
}
我知道一定有某事。我的 proc2 类中错误。这实际上是我第一次使用“Process”类
谢谢!
最佳答案
您正在使用 Scanner.next() 检索下一个命令。您确定这就是您想要做的吗?这会将由空格分隔的所有内容读取为单独的输入,并在不使用空格的情况下写入(删除分隔符)。
EG:“/giveplayeritem”将显示为“/giveplayeritem”,要么在一行上混合在一起,最后不返回,要么“/give\nplayer\nitem”,具体取决于您如何拥有缓冲输出设置为向服务器发送命令。
编辑: 在他的 self 回答中可以看到有效的修复。
基本上,刷新工作不正常,使用自动刷新 println 然后刷新的 printwriter 以某种方式修复了这个问题。
关于java - 通过 java 向 Minecraft 服务器发送命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24490527/