【问题标题】:Implement a Single Instance Java Application [duplicate]实现单实例 Java 应用程序 [重复]
【发布时间】:2012-03-20 23:33:41
【问题描述】:

我不确定这是 Windows 还是 Java 问题。

我有一个在 Windows 下运行的 Java 应用程序。我已将特定文件扩展名(例如 .xyz)与我的应用程序相关联,因此当我双击 .xyz 文件时,我的 Java 应用程序将启动并且 main() 方法将 .xyz 文件视为其第一个参数。

但是当我单击另一个 .xyz 文件时,会启动 Java 应用程序的一个新实例。我希望现有的应用程序来处理新文件。

有没有标准的方法可以做到这一点,还是我需要从头开始编程?

如果是后者,我想我必须做这样的事情:当应用程序的第二个实例启动时,它会检查另一个实例是否已经在运行(如何?),打开一个到第一个实例的通信链接实例,并传递文件的名称。对吧?

【问题讨论】:

标签: java windows ipc


【解决方案1】:

这是一种方法:

当您的main() 触发时,它首先打开一个特定端口并侦听其他(后续)打开文件操作。

如果端口已经打开,则意味着有另一个实例正在运行,因此打开一个到已运行实例的侦听端口的套接字,并为其提供足够的信息以完成处理然后退出。

【讨论】:

  • 这个和其他依赖于侦听套接字的解决方案的问题是,当应用程序第一次运行时,Windows 防火墙要求确认程序(在这种情况下是 JVM)被允许监听连接。也许这只是我必须忍受的事情,但这样的防火墙警告往往会吓到新手用户。
  • 我发现通过使用ServerSocket(int port, int backlog, InetAddress bindAddr) 而不是ServerSocket(int port) 并为bindAddr 提供127.0.0.1 可以避免Window 防火墙投诉。
  • 我接受这个答案。道歉并感谢所有提供类似答案的人。我相信我只能接受一个答案。
【解决方案2】:

这是伪 Java 代码。

try {
    // start as non daemon service.
    new FileNameListener(new ServerSocket(KNOWN_PORT)).start();

} catch (BindException alreadyRunning) {
    // don't start a new service
}
// send to service, which could be the one just started.
sendFileName(new Socket("localhost", KNOWN_PORT), filename);

// finish the current thread, i.e. exit if no service is running.

【讨论】:

    【解决方案3】:

    另外,请阅读与您的问题完全相同的答案:

    【讨论】:

      【解决方案4】:

      请参阅JWS solution。那使用SingleInstanceService。 JWS 还可以声明对文件类型的兴趣。请参阅file service demo. 了解更多信息。

      它可以在 Windows、*nix 和 OS X 上运行(并提供许多其他不错的部署功能)。

      【讨论】:

        【解决方案5】:

        您可以使用 JUnique 库。它提供对运行单实例 java 应用程序的支持,并且是开源的。

        http://www.sauronsoftware.it/projects/junique/

        在How to implement a single instance Java application?查看我的完整答案

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多