Я пишу оболочку для командной строки на базе безголового сервера игры 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 используется.Вместо этого он вообще ничего не выводит, но процесс продолжает работать, и сервер может быть подключен к игре после завершения инициализации.