Почему myProcess.getInputStream () работает с java.exe, а не с javaw.exe? - PullRequest
1 голос
/ 02 июня 2019

Я пишу оболочку для командной строки на базе безголового сервера игры Factorio.Я использую ProcessBuilder и получаю стандартный вывод сервера и использую соединение rcon (длинный рассказ, stdin не работал) для связи с ним.Я почти завершил его до того момента, когда собирался собрать пакет и запустить его на физическом сервере.Это когда я заметил, что запуск jar вместо запуска из IDE (Intelij) предотвращает прохождение любого вывода с сервера.Я сделал еще несколько отслеживаний и обнаружил, что всякий раз, когда я использую .getInputStream () из процесса, выходные данные сервера отправляются только в том случае, если программа была запущена вместе с консолью (java.exe), и вообще не отправляются, если программабыл запущен без него (javaw.exe).

Я протестировал .getInputStream () с cmd.exe, и он отлично работает как с 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));

Позже, ввод обрабатывается графическим интерфейсом и отправляется через rcon (после полной инициализации сервера), а вывод считывается и печатается в канал графического интерфейса., 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());}
        }

Приложение должно было распечатать выходные данные сервера, такие как весь инициализирующий текст о загрузке модов, подключении к серверу поиска совпадений и т. Д., Как это происходит в IDE и при java.exe используется.Вместо этого он вообще ничего не выводит, но процесс продолжает работать, и сервер может быть подключен к игре после завершения инициализации.

...