Communication between two separate Java desktop applications Communication between two separate Java desktop applications java java

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.


They could each listen on a Socket. This tutorial is good to get started.