Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过命令行向服务器发出命令_Java_Eclipse_Windows_Batch File_Cmd - Fatal编程技术网

Java 如何通过命令行向服务器发出命令

Java 如何通过命令行向服务器发出命令,java,eclipse,windows,batch-file,cmd,Java,Eclipse,Windows,Batch File,Cmd,我正在开发一个应用程序,只需单击一个按钮即可启动minecraft服务器。我已经成功地启动了服务器,但现在我正试图找到一种方法,通过相同的cmd进程停止服务器 这是我启动服务器的代码 public static void startServer() { System.out.println("Starting server..."); try { server = Runtime.getRuntime().exec( "java -

我正在开发一个应用程序,只需单击一个按钮即可启动minecraft服务器。我已经成功地启动了服务器,但现在我正试图找到一种方法,通过相同的cmd进程停止服务器

这是我启动服务器的代码

public static void startServer() {
    System.out.println("Starting server...");
    try {
        server = Runtime.getRuntime().exec(
                "java -jar -Xmx1024M -Xms1024M minecraft_server.jar nogui");
        output = server.getOutputStream();
        input = server.getInputStream();
        writer = new BufferedWriter(new OutputStreamWriter(output));
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public static void stopServer() {
    System.out.println("Stopping server...");
    // server.destroy();
    try {
        writer.write("stop\n\r");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
这会告诉运行时执行应用程序同一目录中的run.bat文件。这个方法还初始化了我在这个类的顶部创建的
OutputStream
InputStream
对象

这是我停止服务器的代码

public static void startServer() {
    System.out.println("Starting server...");
    try {
        server = Runtime.getRuntime().exec(
                "java -jar -Xmx1024M -Xms1024M minecraft_server.jar nogui");
        output = server.getOutputStream();
        input = server.getInputStream();
        writer = new BufferedWriter(new OutputStreamWriter(output));
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public static void stopServer() {
    System.out.println("Stopping server...");
    // server.destroy();
    try {
        writer.write("stop\n\r");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
“stop”是我试图向服务器发出的停止命令,但由于某些原因,该命令从未向服务器发出

更多信息:

  • 服务器正在cmd.exe中运行,因此所有服务器cmd都需要在cmd中发出

  • 服务器名为minecraft_server.jar,因此我必须使用命令行运行服务器,从服务器获取输出并向其写入输入

  • run.bat文件包含文本
    java-Xmx1024M-Xms1024M-jar minecraft_server.jar nogui

  • 我的主要目标是将命令“stop”写入服务器以停止它


正如@clearlyspam23所说的,您在向进程写入任何内容的那一刻就扼杀了进程

第二,您正在写入进程的输出流,您希望写入输入流。编辑:没有


此外,任何服务器命令通常都会通过“回车”键进行验证,因此您可能需要在命令之后添加回车符(“\r”)来模拟该命令。

可能是因为您正在调用
server.destroy()
,所以进程从不等待“stop”命令完成执行。您可能希望尝试删除destroy调用,或者在写入stop之后,尝试通过
server.waitFor()等待进程完成
。这应该会有帮助:我不知道如何在windows中执行此操作,但在bash中,我会找到正在运行的实例的pid并杀死该pid,因此要转换的命令可能是
kill'或
killall',如果我猜程序名的路径已经设置好了。一次调试一步。Tryreplacing run.bat的内容带有“模拟”服务器的批处理文件循环,如
:tryagain
pause
echo hello
转到tryagain
。然后查看发送CR/LF是否会导致“hello”出现在输入流上。不管这是否有效,您已经排除了每种情况下大约一半可能的问题原因。实际上,尽管听起来很混乱,但返回子流程的标准输入,因此我相信他实际上正在向正确的流写入代码。我更新了stopServer方法的代码,并尝试运行代码,但仍然没有任何结果。还有其他建议吗?我做错什么了吗?谢谢你的努力。顺便说一句,有一个应用程序窗口,有一个开始按钮和一个停止按钮。“开始”按钮调用
startServer()
方法,“停止”按钮调用
stopServer()
方法。@user2259637我意识到您在windows下,所以请尝试\n和\n\r而不是\r。”。另外,是否正确执行了.bat文件?也许在.bat文件中添加一个echo,然后打印进程的stdout。谢谢你的努力,但我还是没有运气。我会给你发一个我申请的链接。将minecraft_server.jar和ServerHelper放在同一个文件夹中@用户2259637哈,但我正在运行linux,所以我不会提供任何帮助。您确定.bat文件确实在运行吗?