如何向正在运行的Java程序发送命令?

时间:2009-06-25 08:02:54

标签: java winapi ipc

我有一个Java程序,我想从Win32应用程序发送命令。通常我会使用WM_COPYDATA,但我对Java有什么选择?

5 个答案:

答案 0 :(得分:10)

有一些方法可以在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字符串,请注意在Windows-1252代码页中将字符81,8D,8F,90和9D指定为未定义,因此如果Windows字符串包含这些元素,Java将产生问号或异常。因此,如果可能的话,在Windows端使用WChar字符串或限制自己使用安全字符。

答案 1 :(得分:4)

您将需要创建一个网络服务器,如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或其他一些简单的标准化协议。

答案 2 :(得分:3)

不,你不能。

您必须创建网络服务器并侦听(本地)套接字。或者,使用JNI。

答案 3 :(得分:1)

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

一些选项:

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

答案 4 :(得分:1)

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

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

我想Win32有捕获你启动的应用程序的I / O流的方法。

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

ls | grep java