Подтвердить что ты не робот

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

Я ищу для разработки двух отдельных (но связанных) Java-приложений для настольных ПК.

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

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

4b9b3361

Ответ 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/) - это самый простой способ: Java-программы на разных JVM на одном и том же или даже разных компьютерах видят друг друга, как если бы они были выполненных внутри одной JVM на одной машине. Разделение одной программы на несколько не требует даже каких-либо изменений кода - достаточно написать файл конфигурации XML.

Ответ 4

Вы также должны рассмотреть хороший классический RMI.

Ответ 5

Посмотрите JavaGroups, он решит вашу проблему связи, а также поможет вам определить, работает ли другое приложение. Если приложение не работает, вам придется запустить новую JVM для него с помощью java.lang.Runtime.exec()...

Ответ 6

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

Подробнее о как это сделать (документация Sun/Java).

Ответ 7

  • "Корпоративный" способ - запустить эти приложения на сервере Java EE или, по крайней мере, в рамках Spring. Он также, вероятно, значительно переборщил.

  • Если необходимо передать кучу данных, тогда RMI сделает это.

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

  • Я думаю, что есть некоторое грубое обращение к альтернативе общения через файл в общем каталоге (настройка собственного протокола того, кто пишет или стирает файл когда), или через общую базу данных. Низкотехнологичный, не очень быстрый, но очень простой и надежный. И довольно легко контролировать "связь" со стороны.

Ответ 8

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

Ответ 9

I вторая связь Socket и RMI. RMI немного больше задействован, но более интуитивно понятен программисту. Это зависит от того, какую информацию вы отправляете. Нажатие необработанных байтов на другую машину может иметь больше смысла, чем запуск RMI-сервера и работа со всем этим джазом...

Ответ 10

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

Например, ZooKeeper позволяет реализовать практически все, что угодно, поверх простых, но мощных примитивов. Эта страница (http://hadoop.apache.org/zookeeper/docs/current/recipes.html) объясняет, как создавать конструкции более высокого уровня с помощью ZooKeeper.

Недостатком является то, что вам нужна другая система. Если вы используете JGroups, то вы этого не делаете.

Надеюсь, что это поможет

Ответ 11

В зависимости от того, какой стиль коммуникации вы ищете (высокая латентность, множество данных и т.д.), и может ли эта система расширяться только из двух java-систем, возможно, это может быть система обмена сообщениями с использованием промежуточного решения таких как Tibco SmartSockets.

Любая информация о ваших настройках и ожиданиях поможет.