0

Взаимодействие между двумя отдельными Java настольными приложениями

15

Я разрабатываю два отдельных, но связанных, десктопных приложения на Java.

Мне нужно, чтобы одно приложение могло инициировать другое, передавая данные, которые потом можно редактировать и возвращать обратно. То есть связь между приложениями должна быть двусторонней. Если второе приложение уже запущено, я хочу, чтобы они просто взаимодействовали, то есть не хочу просто передавать аргументы через командную строку и т.д.

В общем, какие стратегии или техники я должен рассмотреть, чтобы достичь этой цели?

5 ответ(ов)

0

Чтобы продемонстрировать, как легко настроить взаимодействие между двумя приложениями, обратите внимание на этот демо-пример сетевого буфера обмена с использованием 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;
            }

        });
    }

}

Этот код создает сетевой буфер обмена, который позволяет пользователям перетаскивать файлы между двумя экземплярами приложения. JGroups обеспечивает надежное сетевое взаимодействие, а обработка данных делает процесс простым и интуитивно понятным.

0

Вы также можете рассмотреть старый добрый классический RMI (Remote Method Invocation).

0

Ответ на ваш вопрос:

На "корпоративном" уровне наиболее целесообразно запускать эти приложения на сервере Java EE или, по крайней мере, использовать Spring-фреймворк. Однако, скорее всего, это будет чрезмерным решением для вашей задачи.

Если необходимо передать большой объем данных, можно использовать RMI (Remote Method Invocation).

Если вам не страшно разрабатывать собственный протокол, структуру данных и обработку ошибок, можно настроить серверные и клиентские сокеты для взаимодействия между ними.

Существует также довольно примитивный, но привлекательный способ общения — использовать файл в общей директории (установив свой протокол о том, кто и когда записывает или удаляет файл), или же общую базу данных. Это низкотехнологичный подход, не самый быстрый, но очень простой и надежный. Кроме того, за "коммуникацией" легко следить снаружи.

0

Чтобы упростить ситуацию, почему бы просто не использовать обычные TCP-сокеты?

0

Я полностью согласен с использованием сокетного взаимодействия и RMI. RMI немного сложнее в реализации, но для программиста он более интуитивен. Однако выбор зависит от того, какую информацию вы хотите передать. Если вы просто передаете сырые байты на другой компьютер, возможно, имеет смысл использовать сокеты, а не запускать RMI сервер и разбираться со всеми его нюансами.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь