两个独立的Java桌面应用程序间的通信

我正在寻找开发两个独立的(但相关的)Java桌面应用程序。

我想要一个应用程序触发另一个应用程序的能力,传递可以被编辑和传回的数据,即通信将是双向的。 如果其他应用程序已经运行,我希望他们只是沟通,即我不想只通过命令行传递参数等。

一般来说,为了达到这个目的,我应该看什么策略/技巧?

为了说明让两个应用程序相互通信是多么容易,请使用JGroups检查此networking剪贴板演示。 只需启动两个实例,并开始将文件放入其中一个。 第二个实例将立即显示相同的文件。

import java.io.Serializable; import java.awt.*; import java.awt.datatransfer.*; import javax.swing.*; import org.jgroups.*; public class JGroupsTest { public static void main(String[] args) throws Exception { final JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); frame.setSize(500, 300); final DefaultListModel listModel = new DefaultListModel(); final JList panel = new JList(listModel); panel.setBackground(new Color(128, 0, 40)); panel.setForeground(new Color(240, 240, 240)); frame.add(panel); System.setProperty("java.net.preferIPv4Stack", "true"); final JChannel channel = new JChannel("udp.xml"); channel.connect("networkclipboard"); channel.setReceiver(new ReceiverAdapter() { @Override public void viewAccepted(View newView) { frame.setTitle("Network Clipboard - " + channel.getLocalAddress()); } @Override public void receive(Message msg) { listModel.addElement(msg.getObject()); } }); panel.setTransferHandler(new TransferHandler() { @Override public boolean importData(JComponent comp, Transferable t) { DataFlavor[] transferDataFlavors = t.getTransferDataFlavors(); for (DataFlavor flavor : transferDataFlavors) { try { Object data = t.getTransferData(flavor); if (data instanceof Serializable) { Serializable serializable = (Serializable) data; Message msg = new Message(); msg.setObject(serializable); channel.send(msg); } } catch (Exception e) { e.printStackTrace(); } } return super.importData(comp, t); } @Override public boolean canImport(TransferSupport support) { return true; } @Override public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { return true; } }); } } 

这取决于你想如何沟通这两个程序:

他们可以每个听一个Socket 。 本教程很好开始。

你也应该考虑好的经典RMI。

看看JavaGroups ,它将解决您的通信问题,并帮助您检测其他应用程序是否正在运行。 如果应用程序没有运行,则必须使用java.lang.Runtime.exec()为其启动新的JVM …

尝试与SocketCommunication通信,即使应用程序在同一台机器上。

这里可以find更多关于如何做的信息(Sun / Java文档)。

  • “企业”的方式是在Java EE服务器或至less在Spring框架中运行这些应用程序。 这也可能是过度杀伤力。

  • 如果需要传递一堆数据,那么RMI就会这样做。

  • 如果您不害怕破解自己的协议,数据结构和error handling,则可以设置服务器和客户端套接字并通过这些套接字进行通信。

  • 我认为,通过通用目录中的文件进行通信的替代方法(build立自己的协议,以便在何时写入或擦除文件)或通过共享数据库有一定的原始吸引力。 技术含量低,不是非常快,但非常简单可靠。 从外部监控“沟通”是相当容易的。

为了简单起见,为什么不使用普通的TCP套接字?

我第二个Socket通信和RMI。 RMI是一个更多的参与,但更直观的程序员。 这取决于你发送什么types的信息。 将原始字节推送到另一台机器可能会更有意义,然后运行RMI服务器并处理所有爵士乐…

这取决于你想在两个应用程序之间做什么样的沟通。 例如,如果使用套接字或RMI,则两个应用程序都需要启动才能进行通信。 如果您想要进行的通信types可以更加asynchronous,那么您可以使用更多基于消息传递的方法。

例如,ZooKeeper允许你在非常简单而强大的基元上实现任何你想要的东西。 这个页面( http://hadoop.apache.org/zookeeper/docs/current/recipes.html )解释了如何使用ZooKeeper构build更高层次的结构。

缺点是你需要另一个系统。 如果您使用JGroups例如,那么你不。

希望这可以帮助

根据您所寻找的通信风格(高延迟,大量数据等)以及该系统是否可能扩展到仅仅2个Java系统,可能会使用中间件解决scheme(如Tibco的SmartSockets。

有关您的设置和期望的更多信息将有所帮助。