【问题标题】:How can I send a command to a running Java program?如何向正在运行的 Java 程序发送命令?
【发布时间】:2010-11-05 18:36:43
【问题描述】:

我有一个 Java 程序,我想从我的 Win32 应用程序发送一个命令。通常我会使用WM_COPYDATA,但我有哪些 Java 选项?

【问题讨论】:

    标签: java winapi ipc


    【解决方案1】:

    不,你不能。

    你必须创建一个网络服务器并监听一个(本地)套接字。或者,也可以使用 JNI。

    【讨论】:

      【解决方案2】:

      Java 和 win32 bith 实现了许多相同的技术,因此让两个应用程序通信并非不可能,只需选择两个应用程序通用的传输和协议

      一些选项:

      1. 在进程之间创建 tcp 连接并将数据包发送到环回接口。
      2. 使用 java 具有的任何本机代码互操作(JNI?)来订阅自定义消息(在 win32 的意义上)
      3. 使用本机代码,在两个进程之间建立命名管道
      4. 读/写文本文件(不是最好的主意)

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        您需要创建一个网络服务器,如 J16 SDiZ 所述。

        • 一种简单的方法是使用XML-RPC。 Java 和几乎任何其他语言都有现成的库,而且很简单。我们在我们的应用程序中使用它。但实际上,任何网络协议都可以。
        • 对于非常简单的情况,您也可以只创建一个文件并从 Java 端轮询它。
        • 您也可以使用命名管道:http://www.coderanch.com/t/328057/Java-General-advanced/java/Use-Named-Pipe-IPC-between
        • 还有RMI,但这对于您的(简单)目的来说可能是多余的。最后,您可以使用 JNI 直接访问 Window 的原生通信机制。

        就我个人而言,我会使用 XML-RPC 或其他一些简单的标准化协议。

        【讨论】:

          【解决方案4】:

          有一些方法可以在 Java 和 Windows 之间进行互操作。按力量和难度排序:

          • 对于处理窗口消息,您可以使用 Jawin - 它甚至具有 demo of how to handle window messages - 或类似的东西。当然,如果你将你的 Java 程序绑定到像 Jawin 这样的库,它就永远不会在非 Windows 机器上运行
          • 对于 Win32 和 Java 之间的简单交互,绑定只在 localhost 上侦听的套接字将是我最喜欢的选择。该协议可能很简单,但我更喜欢纯文本协议以便于调试。请注意,如果用户终止程序,套接字连接可能会中断。
          • 您可以使用(本地)网络服务,就像这里其他帖子中所建议的那样。在双方都确保您使用您的 Webservice/XML 库来构造和解析消息,如果您进行字符串连接,那么构造格式错误的 XML 太容易了。
          • 您可以将 Windows 程序的功能放入 COM 组件并使用 Java-to-COM 桥接器:Jacob 或 j-Interop 是流行的免费库,j-Integra 似乎是使用遗留系统的企业的热门选择.
          • 您可以将 Java 程序的功能放入 COM 组件中,并使用 Sun 的 Java-ActiveX 桥接器。根据我的个人经验,这是一个相当尴尬的选择:Java-ActiveX 桥的开发自 1.4 以来一直停滞不前,安装 ActiveX 会导致您的 Java 组件安装在 JRE 目录中的某个位置,并在 ActiveX 容器中调试您的 Java 组件比较麻烦。

          旁注:如果您同时处理字符串,请始终考虑到 Java 将字符串处理为与字节数组完全不同的东西。特别是如果您使用 Windows ANSI 字符串,请注意字符 81、8D、8F、90 和 9D 在 Windows-1252 代码页中指定为未定义,因此如果您的 Windows 字符串包含这些元素,Java 将产生问号或异常。因此,如果可能,请在 Windows 端使用 WChar 字符串或将自己限制为安全字符。

          【讨论】:

            【解决方案5】:

            您可以使用命令行 I/O 流来发送命令并检索答案:

            • System.in 包装到 BufferedReader 中并调用 readLine()
            • System.out.println() 写回复

            我猜 Win32 有一些方法可以捕获你启动的应用程序的 I/O 流。

            基本上相当于 Windows 的 Linux 管道方式:

            ls | grep java
            

            【讨论】:

            • 这听起来确实很优雅,但是如何我如何从 Win32 应用程序中编写一些可以被我的 Java 程序从 System.in 读取的东西?
            • 我曾经知道如何编写 Win32 API,但我记不太清了。当您创建运行参数以使用 CreateProcess 运行应用程序时,您可以随后或稍后调用其他函数来检索您刚刚创建的进程的输入和输出流。在 MSDN 中查看 CreateProcess 及其邻近函数的文档。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-30
            • 2010-11-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-19
            相关资源
            最近更新 更多