Communication between two separate Java desktop applications
To show how easy it is to let two applications communicate with each other, check out this network-clipboard demo using JGroups. Just start two instances and begin dropping files into one of them. The second instance will instantly show the same files.
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; } }); }}
It depends how would you like to communicate those 2 programs:
If you need only inter-process semaphores, create a file somewhere in /tmp and lock it.
If you need only inter-process synchronous messaging (remote procedure call), RMI should be easiest.
If you need asynchronous interprocess messaging, JMS should be easiest.
If you need inter-process shared memory, use mapped files.
If you need all the above, Terracotta (http://www.terracotta.org/ ) is the easiest way: Java programs on different JVMs on the same or even different computers see each other as if they were executed inside one JVM on one machine. Splitting one program into a few doesn't even require any code changes - it's enough to write an XML config file.