两个独立的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; } }); } }
这取决于你想如何沟通这两个程序:
-
如果您只需要进程间信号量,请在/ tmp中的某处创build一个文件并将其locking。
-
如果您只需要进程间同步消息(远程过程调用),则RMI应该是最简单的。
-
如果您需要asynchronous的进程间消息传递,JMS应该是最简单的。
-
如果您需要进程间共享内存,请使用映射文件。
-
如果你需要上述所有内容,Terracotta(http://www.terracotta.org/)是最简单的方法:在同一个甚至不同计算机上的不同JVM上的Java程序互相看到对方,就好像它们在一个JVM上执行一个机。; 将一个程序拆分成几个程序甚至不需要更改代码 – 编写XMLconfiguration文件就足够了。
他们可以每个听一个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。
有关您的设置和期望的更多信息将有所帮助。