我是Java网络的新手,正在为使用Javafx实现的Texas Holdem游戏构建服务器来处理联网的多人游戏(这是我们班的最终项目),我正在尝试将其设置为用户可以选择是否要托管新游戏,从而启动服务器或加入其他服务器(在同一LAN上)的方式。为此,我尝试通过一种当用户决定托管游戏时执行的方法来启动服务器。
我尝试使用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选项可能出了一些问题,因此我尝试了几种不同的类路径,但是都返回相同的错误。该命令还有其他问题吗?