【问题标题】:Limit Java Applet to only one instance将 Java Applet 限制为仅一个实例
【发布时间】:2010-07-19 09:57:24
【问题描述】:

一段时间以来,我一直在使用 Stackoverflow 来寻找编程问题的解决方案,但对于当前的问题,我还没有找到有用的解决方案。所以我加入了。

将 Java 小程序限制为仅一个实例是一个很好的解决方案。我正在使用 php 将小程序提供给最终用户,所以这是一个选择。

但如果我可以通过 Applet 本身限制 Java Applet 的执行,我会更感兴趣。我对 Java 还很陌生,所以我真的不知道从哪里开始寻找这样的结构。

任何建议将不胜感激。

作为旁注,“ javascript to launch only ONE window for a Java applet with a given URL" 将是一个解决方案。虽然我将小程序嵌入到我正在构建的应用程序中,但我并不热衷于为小程序提供服务的弹出窗口。

真诚地, AltWouss

编辑:
澄清实例限制。我希望每台机器只加载一个小程序。

【问题讨论】:

  • 您是否试图阻止用户在同一浏览器的不同选项卡中运行该小程序的两个副本?还是不同的浏览器窗口?或者完全在不同的浏览器中运行它? (比如说,在 Firefox、Chrome、Opera、IE、Safari 中各一个?)或者同时登录到具有两个用户的机器并在每个用户帐户中运行一个?或者试图阻止它在世界某个地方的两台机器上运行? (比如说,你在日本的朋友 Toshi 启动了这个小程序,这应该会阻止你在芬兰的朋友 Mika 运行这个小程序吧?)
  • 防止它在一台机器上运行2个副本。

标签: java php applet single-instance


【解决方案1】:

为什么不在您的小程序的众所周知的端口上启动一个 SocketServer 呢?

如果打开那个 SocketServer,可能是因为另一个已经在运行。然后,您可以显示一条消息告诉您。

【讨论】:

  • 这会抛出“java.security.AccessControlException”吗?
  • 这取决于您的小程序的权限。
  • 一段时间以来,applet 已被允许侦听端口(大于 1024,受操作系统限制、可用性等限制)。他们不能做的是接受来自“同源”服务器以外的任何地方的连接。
【解决方案2】:

如果您使用 Java WebStart,则有 JNLP SingleInstanceService

【讨论】:

    【解决方案3】:

    不幸的是,Java 不支持命名互斥锁用于跨进程锁定。但是,您可以通过简单地在您的小程序启动时在已知位置创建一个具有已知名称的文件来实现原始锁。如果无法创建该文件,那么您知道该文件已经存在,因为该应用程序之前已经启动过一次。要确保在应用程序关闭时删除文件,只需调用 File.deleteOnExit() 方法。

    类似:

    if(file.createNewFile()) {
        file.deleteOnExit();
    } else {
        throw new Exception("Instance already running!");
    }
    

    不是一个完美的解决方案,当然也存在一些问题......但这对于您想要做的事情可能已经足够了。还可以查看 FileLock 类,它可以提供更强大和更合适的解决方案。

    【讨论】:

      【解决方案4】:

      我不确定这是否会有所帮助.. 但我想到的第一件事是.. 是否可以使小程序成为单例? 抱歉,这更像是一个后续问题,而不是一个答案......

      【讨论】:

      • 没有。这无济于事,因为多个小程序在不同的虚拟机中运行
      猜你喜欢
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 2023-03-05
      • 2021-10-25
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      相关资源
      最近更新 更多