猿问

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

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

我希望一个应用程序能够触发另一个应用程序,传递可以进行编辑和传回的数据,即通信将是两种方式。如果另一个应用程序已经在运行,我希望他们之间进行交流,即我不想仅通过命令行传递参数,等等。

一般来说,为了达到这个目的,我应该考虑哪些策略/技术?


翻阅古今
浏览 678回答 3
3回答

jeck猫

为了显示让两个应用程序相互通信有多么容易,请使用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;            }        });    }}

千巷猫影

“企业”方式是在Java EE服务器或至少在Spring框架中运行这些应用程序。这也可能是过大的杀伤力。如果需要传送一堆数据,则RMI将执行此操作。如果您不怕自己的协议,数据结构和错误处理,可以设置服务器和客户端套接字并通过它们进行通信。我认为,通过公共目录中的文件(设置您自己的协议谁写或何时删除文件)或通过共享数据库进行通信的选择具有一定的吸引力。技术含量低,不是非常快,但是非常简单可靠。而且,从外部监视“通信”也相当容易。
随时随地看视频慕课网APP

相关分类

Java
我要回答