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

2022-08-31 20:33:19

我希望开发两个独立的(但相关的)Java桌面应用程序。

我希望一个应用程序能够触发另一个应用程序,传入数据,然后可以编辑和传回,即通信将是双向的。如果另一个应用程序已经在运行,我希望它们只是通信,即我不想只是在命令行上传递参数,等等。

一般来说,为了实现这一目标,我应该考虑哪些策略/技术?


答案 1

为了说明让两个应用程序相互通信是多么容易,请查看这个使用 JGroups 的网络剪贴板演示。只需启动两个实例,然后开始将文件拖放到其中一个实例中即可。第二个实例将立即显示相同的文件。

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;
            }

        });
    }

}

答案 2

这取决于您希望如何传达这2个程序:

  • 如果只需要进程间信号量,请在 /tmp 中的某个位置创建一个文件并将其锁定。

  • 如果只需要进程间同步消息传递(远程过程调用),则 RMI 应该是最简单的。

  • 如果需要异步进程间消息传递,JMS 应该是最简单的。

  • 如果需要进程间共享内存,请使用映射文件。

  • 如果你需要上述所有,Terracotta(http://www.terracotta.org/)是最简单的方法:相同甚至不同计算机上的不同JVM上的Java程序彼此看到,就好像它们在一台机器上的一个JVM中执行一样。将一个程序拆分为几个程序甚至不需要任何代码更改 - 编写XML配置文件就足够了。


推荐