java - 通过 java 向 Minecraft 服务器发送命令

标签 java multithreading process

您好,我想向正在运行的 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/

相关文章:

java - 将文件复制到 Assets 文件夹

java - 在端口 80 上设置 tomcat 后,PhpMyAdmin 无法访问

java - spring-kafka监听并发

eclipse - eclipse (保存工作台状态)

c - 从 parent 向 child 发送信号,反之亦然

process - 在 elixir 中创建一个假的或虚拟的 pid

java - Sonar 排除 - 项目属性文件或常规设置

java - 红黑树可比

c++ - 在 C++11 中的线程之间高效安全地传递不可变对象(immutable对象)

c++ - 如何实现线程安全的功能