我需要防止用户多次启动我的 Java 应用程序(WebStart Swing 应用程序)。因此,如果应用程序已经在运行,则不应再次启动它或显示警告/再次关闭。
有没有一些方便的方法来实现这一点?我想过阻塞一个端口或将某事写入文件。但是希望您可以访问一些系统属性或 JVM?
顺便说一句。目标平台是带有 Java 1.5 的 Windows XP
最佳答案
我认为您建议在启动应用程序时打开一个端口进行监听是最好的主意。
这很容易做到,您无需担心在关闭应用程序时清理它。例如,如果您写入文件但有人使用任务管理器终止进程,则该文件不会被删除。
另外,如果我没记错的话,没有简单的方法可以从 JVM 内部获取 Java 进程的 PID,所以不要尝试使用 PID 制定解决方案。
这样的事情应该可以解决问题:
private static final int PORT = 9999;
private static ServerSocket socket;
private static void checkIfRunning() {
try {
//Bind to localhost adapter with a zero connection queue
socket = new ServerSocket(PORT,0,InetAddress.getByAddress(new byte[] {127,0,0,1}));
}
catch (BindException e) {
System.err.println("Already running.");
System.exit(1);
}
catch (IOException e) {
System.err.println("Unexpected error.");
e.printStackTrace();
System.exit(2);
}
}
此示例代码明确绑定(bind)到 127.0.0.1
,这应避免任何防火墙警告,因为此地址上的任何流量都必须来自本地系统。
选择端口时,请尽量避免 list of Well Known Ports 中提到的端口。理想情况下,您应该在文件中或通过命令行开关配置使用的端口,以防发生冲突。
关于java - 如何允许一次只运行一个 Java 程序的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/920386/