gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:48:05 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com