为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻阅古今 2019-11-27 10:45:03
我正在寻找开发两个单独的(但相关的)Java桌面应用程序。我希望一个应用程序能够触发另一个应用程序,传递可以进行编辑和传回的数据,即通信将是两种方式。如果另一个应用程序已经在运行,我希望他们之间进行交流,即我不想仅通过命令行传递参数,等等。一般来说,为了达到这个目的,我应该考虑哪些策略/技术?
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

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

            }


        });

    }


}


查看完整回答
反对 回复 2019-11-27
?
千巷猫影

TA贡献1829条经验 获得超7个赞

  • “企业”方式是在Java EE服务器或至少在Spring框架中运行这些应用程序。这也可能是过大的杀伤力。

  • 如果需要传送一堆数据,则RMI将执行此操作。

  • 如果您不怕自己的协议,数据结构和错误处理,可以设置服务器和客户端套接字并通过它们进行通信。

  • 我认为,通过公共目录中的文件(设置您自己的协议谁写或何时删除文件)或通过共享数据库进行通信的选择具有一定的吸引力。技术含量低,不是非常快,但是非常简单可靠。而且,从外部监视“通信”也相当容易。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 677 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信