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