Saltar al contenido

Comunicación entre dos aplicaciones de escritorio Java separadas

Luego de investigar con expertos en este tema, programadores de diversas áreas y maestros hemos dado con la solución al problema y la dejamos plasmada en esta publicación.

Solución:

Para mostrar lo fácil que es permitir que dos aplicaciones se comuniquen entre sí, consulte esta demostración de portapapeles de red usando JGroups. Simplemente inicie dos instancias y comience a colocar archivos en una de ellas. La segunda instancia mostrará instantáneamente los mismos archivos.

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;
            

        );
    


Depende de cómo le gustaría comunicar esos 2 programas:

  • Si solo necesita semáforos entre procesos, cree un archivo en algún lugar de /tmp y bloquéelo.

  • Si solo necesita mensajería síncrona entre procesos (llamada a procedimiento remoto), RMI debería ser más fácil.

  • Si necesita mensajería asíncrona entre procesos, JMS debería ser más fácil.

  • Si necesita memoria compartida entre procesos, use archivos asignados.

  • Si necesita todo lo anterior, Terracotta (http://www.terracotta.org/ ) es la forma más fácil: los programas Java en diferentes JVM en la misma o incluso en diferentes computadoras se ven como si se ejecutaran dentro de una JVM en una máquina. Dividir un programa en varios ni siquiera requiere ningún cambio de código: es suficiente para escribir un archivo de configuración XML.

Cada uno podría escuchar en un Socket. Este tutorial es bueno para empezar.

Te mostramos las comentarios y valoraciones de los lectores

Recuerda que puedes optar por la opción de agregar una reseña si acertaste tu rompecabezas a tiempo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *