1

我正在为游戏 Factorio 的基于命令行的无头服务器编写一个包装器。我正在使用 ProcessBuilder 并获取服务器的标准输出,并使用 rcon 连接(长话短说,标准输入不工作)与之通信。我已经差不多完成了,直到我将打包 jar 并在物理服务器上运行它。这时我注意到运行 jar 而不是从 IDE (Intelij) 运行会阻止来自服务器的任何输出通过。我做了一些更多的窥探,发现每当我从进程中使用 .getInputStream() 时,服务器的输出只有在程序沿着控制台(java.exe)启动时才会发送,如果程序根本不会发送在没有它的情况下启动(javaw.exe)。

我用 cmd.exe 测试了 .getInputStream(),它对 java.exe 和 javaw.exe 都很好。我还检查了代码是否遵循一些我在 IDE 之外运行时没有预料到的流程,但它在 read.readLine() 上阻塞,就好像它在等待输入但没有收到任何东西一样。

该过程在这里初始化:

ProcessBuilder pb = new ProcessBuilder(gameExecutablePath, "--start-server", saveLocation + "\\" + saveName, "--server-settings", serverSettingsLocation + "\\" + serverSettingsName, "-c", serverConfigLocation + "\\" + serverConfigName, "--rcon-port", "" + rconPort, "--rcon-password", "" + rconPasskey);

        pb.redirectErrorStream(true);

        try
        {
            myProcess = pb.start();
        }catch(Exception e){e.printStackTrace();}

        if(myProcess == null) { stop();}

        OutputStream serverInput = myProcess.getOutputStream();
        write = new BufferedWriter(new OutputStreamWriter(serverInput));

        InputStream serverOutput = myProcess.getInputStream();
        read = new BufferedReader(new InputStreamReader(serverOutput));

稍后,输入由 gui 处理并通过 rcon 发送(在服务器完全初始化之后),输出被读取并打印到 gui 的提要 JTextArea,这里:

while(serverRunning)
        {
            try
            {
                String line = "" + read.readLine();
                if(line == null)
                {
                    continue;
                }
                line = line.trim();
                if(line.contains("Opening socket for broadcast"))
                {
                    serverInitialized = true;
                    initializeRCONConnection();
                }

                synchronized(serverFeedStringBuilder)
                {
                    printToServerFeed(line);
                }

            }catch(Exception e){e.printStackTrace();printToServerFeed(e.getMessage());}
        }

应用程序应该已经打印出服务器的输出,例如所有关于 modloading、连接到匹配服务器等的初始化文本,就像在 IDE 中和使用 java.exe 时一样。相反,它根本不输出任何东西,但进程继续运行,并且服务器可以在完成初始化后连接到游戏中。

4

0 回答 0