Попытка запустить сервер из командной строки с помощью ProcessBuilder - PullRequest
0 голосов
/ 02 июня 2019

Я студент, новичок в java-сетях, работаю над созданием сервера для сетевой многопользовательской игры для игры в Техасский Холдем, реализованной в javafx (это финальный проект нашего класса), и я пытаюсь настроить его таким образом. способ, которым пользователи могут выбрать, хотят ли они разместить новую игру, таким образом, запустив сервер, или присоединиться к чужому серверу (в той же локальной сети). С этой целью я попытался запустить сервер способом, выполняемым, когда пользователь решает разместить игру.

Я попытался запустить сервер, используя ProcessBuilder, чтобы запустить команду java для скомпилированного файла класса, но я не уверен, что он успешно выполняется. Я также задавался вопросом, смогу ли я избежать попыток заставить его работать должным образом, сделав мой класс сервера Runnable и переопределив метод "main" как метод "run".

Вот код, который я использовал для запуска сервера из командной строки. Путь к моему файлу скомпилированного класса сервера: C:\Users\glacu\Desktop\SillySolitaire\build\classes\sillysolitaire Я использую NetBeans 8.2, а приложение запускается из каталога SillySolitaire.

ОБНОВЛЕНИЕ: Изменен код, чтобы попытаться получить поток ошибок, а также распечатать оба лениво. Я думаю, что это должно работать, если процесс запускается правильно, но я не получаю вывод ни из потока ошибок, ни из потока вывода.

String javaExecutable = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";

        try{
            Process p = new ProcessBuilder(javaExecutable, "-classpath", "build" + File.separator + "classes" + File.separator + "*", "sillysolitaire.GameServer").start();
            InputStream inputStream = p.getInputStream();
            BufferedReader isr = new BufferedReader(new InputStreamReader(inputStream));
            InputStream errorStream = p.getErrorStream();
            BufferedReader esr = new BufferedReader(new InputStreamReader(inputStream));
            isr.lines().forEach(System.out::println);
            esr.lines().forEach(System.out::println);
        } catch(IOException e){
            e.printStackTrace();
        }

Вот текущий код запуска сервера

    public static void main(String[] args){
        targetPlayers = 2;
        gs = new GameState(targetPlayers);
        dealHands();
        System.out.println("Server is running...");
        ExecutorService pool = Executors.newFixedThreadPool(500);
        try (ServerSocket listener = new ServerSocket(59001)) {
            while (playersInLobby < targetPlayers) {
                handler = new Handler(listener.accept());
                threadList.add(handler);
                pool.execute(handler);
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }

Сервер начинает нормально запускать файл напрямую, но не тогда, когда я пытаюсь запустить его с помощью ProcessBuilder.

ОБНОВЛЕНИЕ: Это, я считаю, точная команда, выполняемая ProcessBuilder.
"C:\Program Files\Java\jdk1.8.0_111\jre\bin\java" -classpath C:\Users\glacu\Desktop\SillySolitaire\build\classes\* sillysolitaire.GameServer
Выполнение из моей командной строки возвращает: Ошибка: не удалось найти или загрузить основной класс sillysolitaire.GameServer
Я думаю, что-то может быть не так с опцией -classpath, и поэтому я пробовал несколько разных путей к классам, но все они возвращали одну и ту же ошибку. Что-то еще не так с командой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...