Filtro CPL Polarizado ventajas

Servidor y cliente RPC/RMI en Java - Sistemas Distribuidos (práctica completa con base de datos)

Hola a todos!, los saluda Iván Luis Jiménez !


Hoy les vengo compartiendo unos  programas hechos en Java, uno tiene la función de Servidor (replicar un servidor) y otro de Cliente. Se basa en la arquitectura de cliente-servidor, las conexiones del cliente hacia el servidor se hacen con ayuda de XML-RPC (llamadas a procedimientos remotos) y de Java RMI (invocación de métodos remotos). Todo esto para la Materia de Sistemas Distribuidos.

A grandes rasgos este proyecto cumple con los siguientes requisitos:

Procedimientos RPC:
1. Tres delegaciones (top 3) con mayor número de delitos en un año
determinado.
2. Número de delitos en una delegación determinada y de un tipo de delito
determinado.
3. Mes del año con mayor número de un delito determinado.

Métodos Java RMI
1. Datos (fecha, colonia y tipo) de uno o varios delitos de una coordenada
determinada (CoordX, CoordY).
2. Datos (hora, calles, delegación y tipo) de uno o varios delitos de un cuadrante
determinado.

Se debe implementar una replicación de solo un conjunto de servicios. Es decir, replicar ya sea los procedimientos RPC o los métodos de Java RMI en un segundo servidor (yo en lo personal decidí replicar los dos servicios RPC y RMI).

Así pues la aplicación cliente deberá proporcionar un menú donde el usuario podrá, primero, elegir una categoría (RPC o RMI), luego elegir la operación o método a llamar e ingresar el o los parámetros correspondientes.

En cada servidor se encuentra la base de datos con la información correspondiente (recomiendo discreción con la información).

Ahora les mostraré unas capturas del sistema en funcionamiento, cabe mencionar que fue implementada en consola, sólo la información de RMI se muestra de manera gráfica al momento de retornar la información al cliente.
El servidor A esta en la computadora virtual junto con el cliente y el servidor B esta en la computadora anfitrión. 


No se pudo conectar al Servidor A ni al B, ya que ningún servidor esta corriendo.


Como el Servidor B se esta ejecutando, el cliente se conecta al B.



Como el Servidor A se esta ejecutando, el cliente se conecta al A.
Si los dos estuvieran ejecutándose se conectaría a Servidor A.

 Ahora haciendo las consultas correspondiente desde cliente al Servidor A.



Del cliente al Servidor B



Ahora les muestro el código de todo el proyecto, claro por partes.

Código del Servidor (es lo mismo que el servidor A y B sólo cambia en la IP)
Su estructura se ve así:


Paquete bd_datos
conexion.java

package bd_datos;

import java.sql.Connection;
import java.sql.DriverManager;

/**
 *
 * @author Ivan Luis Jimenez
 */
public class conexion {
        Connection con = null;
    public Connection conex (){
        try{
        Class.forName("com.mysql.jdbc.Driver");
        con= DriverManager.getConnection("jdbc:mysql://localhost/sd","root","chkdskshrasd");
            System.out.println("[Servidor BD] Conexion establecida");
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
        return con;
    }
}


Paquete servera
ServerA.java


package servera;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import org.apache.xmlrpc.*;

/**
 *
 * @author Ivan Luis Jimenez
 */
public class ServerA {
    /*
     *Atributos de Servidor RPC
     */

    WebServer serverRPC = new WebServer(81);
    ServerObject_RPC op = new ServerObject_RPC();

    public static void main(String[] args) {
        ServerA ob = new ServerA();
        ob.iniciar_RPC();
        ob.iniciar_RMI();

    }

    public void iniciar_RPC() {
        try {
            serverRPC.addHandler("ServerRPC", op);
            serverRPC.start();
            Write("RPC ejectandose correctamente");
        } catch (Exception e) {
            Write("[RPC]:" + e.getMessage());
        }

    }

    public void iniciar_RMI() {
        Registry reg;       
        try {            
            reg = LocateRegistry.createRegistry(1099);
            reg.rebind("ServerRMI", new ServerObject_RMI());
            Write("RMI ejectandose correctamente");
        } catch (Exception e) {
            Write("[RMI]:" + e.getMessage());
        }
    }

    public static void Write(String msg) {
        System.out.println("[Servidor]" + msg);
    }

}

ServerObject_RPC.java

package servera;

import bd_datos.conexion;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;

/**
 *
 * @author Ivan Luis Jimenez
 */
public class ServerObject_RPC {

    conexion C = new conexion();
    Connection CC = C.conex();
    PreparedStatement us;

    Vector tres_del = new Vector();
    Vector Delegaciones = new Vector();
    int num_del;

    String mes;

    public Vector mayor_year(int year) {
        tres_del.clear();
        Delegaciones.clear();
        int[] arreglo;
        int mayor1 = 0;
        int mayor2 = 0;
        int mayor3 = 0;
        int dele1 = 0;
        int dele2 = 0;
        int dele3 = 0;
        try {
            String consulta = "SELECT DISTINCT DELEGACION FROM datos WHERE YEAR=" + year;
            Statement st = CC.createStatement();
            ResultSet rs = st.executeQuery(consulta);
            int del = 0;
            while (rs.next()) {
                Delegaciones.add(del, rs.getString("DELEGACION"));
                del++;
            }

            arreglo = new int[del];
            for (int b = 0; b < arreglo.length; b++) {
                Statement st2 = CC.createStatement();
                ResultSet rs2 = st2.executeQuery("SELECT COUNT(DELITO) FROM datos WHERE DELEGACION LIKE '" + Delegaciones.get(b) + "' AND YEAR=" + year);
                while (rs2.next()) {
                    arreglo[b] = Integer.parseInt(rs2.getString("COUNT(DELITO)"));
                    if ((arreglo[b] >= mayor1) && (dele1 != b)) {
                        mayor1 = arreglo[b];
                        dele1 = b;
                    }                   
                }

            }
            for (int i = 0; i < arreglo.length; i++) {
                if((arreglo[i]< mayor1) && (arreglo[i]>mayor2) && (arreglo[i]!=mayor1)){
                    mayor2 = arreglo[i];
                    dele2 = i;
                }
            }
            
            for (int i = 0; i < arreglo.length; i++) {
                if(((arreglo[i] < mayor1) && (arreglo[i]mayor3) && (arreglo[i]!=mayor1) && (arreglo[i]!=mayor2)){
                    mayor3 = arreglo[i];
                    dele3 = i;
                }
            }
            ServerA.Write("[RPC]Los mas grandes:" +dele1+" "+ mayor1 + " " +dele2+" "+ mayor2 + " " +dele3+" "+ mayor3);
            ServerA.Write(Delegaciones.get(dele1)+" "+Delegaciones.get(dele2)+" "+Delegaciones.get(dele3));
            tres_del.addElement(Delegaciones.get(dele1)+" ("+mayor1+")");
            tres_del.addElement(Delegaciones.get(dele2)+" ("+mayor2+")");
            tres_del.addElement(Delegaciones.get(dele3)+" ("+mayor3+")");            

        } catch (Exception e) {
            ServerA.Write("" + e.getMessage());
        }
        ServerA.Write("[RPC]El cliente ejecutó método A");
        return tres_del;
    }

    public int num_dele(String del, String tipo) {
        num_del=0;
        try {
            String consulta = "SELECT DELEGACION,COUNT(DELITO) FROM datos"
                    + " WHERE DELEGACION LIKE '" + del + "' AND DELITO LIKE '" + tipo + "'";
            Statement st = CC.createStatement();
            ResultSet rs = st.executeQuery(consulta);
            while (rs.next()) {
                num_del = Integer.parseInt(rs.getString("COUNT(DELITO)"));
            }

        } catch (Exception e) {
            ServerA.Write("[RPC]Error:" + e.getMessage());
        }
        ServerA.Write("[RPC]El cliente ejecutó método B");
        return num_del;
    }

    public String num_del(String delito) {
        mes = "Nada";
        int[] arreglo = new int[12];
        int mayor = 0;
        int mes_m = 0;
        Vector meses = new Vector();
        meses.addElement("Enero");
        meses.addElement("Febrero");
        meses.addElement("Marzo");
        meses.addElement("Abril");
        meses.addElement("Mayo");
        meses.addElement("Junio");
        meses.addElement("Julio");
        meses.addElement("Agosto");
        meses.addElement("Septiembre");
        meses.addElement("Octubre");
        meses.addElement("Noviembre");
        meses.addElement("Diciembre");
        try {
            for (int i = 0; i < 12; i++) {
                String consulta = "SELECT COUNT(DELITO) FROM datos WHERE DELITO LIKE '" + delito + "' AND MES=" + i;
                Statement st = CC.createStatement();
                ResultSet rs = st.executeQuery(consulta);

                while (rs.next()) {
                    arreglo[i] = Integer.parseInt(rs.getString("COUNT(DELITO)"));
                    if (arreglo[i] >= mayor) {
                        mayor = arreglo[i];
                        mes_m = i;
                    }
                }
            }

            if (mayor == 0) {
                mes = "Nada";
            } else {
                ServerA.Write("[RPC]Mes mayor:" + mes_m + " con " + mayor + " delitos");
                mes = meses.get(mes_m - 1);
            }
        } catch (Exception e) {
            ServerA.Write("[RPC]Error:" + e.getMessage());
        }
        return mes;
    }
}

ServerObject_RMI.java

package servera;

import bd_datos.conexion;
import java.rmi.server.UnicastRemoteObject;
import Stub.Stub;
import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.util.Vector;

/**
 *
 * @author Ivan Luis Jimenez
 */
public class ServerObject_RMI extends UnicastRemoteObject implements Stub {
    /*
     *Parametros para la conexion y consultas a la base de datos
     */

    conexion C = new conexion();
    Connection CC = C.conex();
    PreparedStatement us;

    /*
     *Vectores para almacenar los resultados
     */
    Vector> Dcoo = new Vector>();
    Vector Dcua = new Vector();
    Vector> vv = new Vector>();

    /*
     *Vectores para método E
     */
    Vector hora = new Vector();
    Vector calle1 = new Vector();
    Vector calle2 = new Vector();
    Vector delegacion = new Vector();
    Vector delito = new Vector();

    /*
     *Vectores para método D    
     */
    Vector fecha = new Vector();
    Vector colonia = new Vector();
    Vector tipo = new Vector();

    public ServerObject_RMI() throws java.rmi.RemoteException {
        super();
    }

    @Override
    public Vector> Dcoor(String cuadrante) throws RemoteException {
        String HORA, CALLE1, CALLE2, DELEGACION, DELITO;
        limpiar_E();
        try {
            String consulta = "SELECT HORA, CALLE1, CALLE2, DELEGACION, DELITO FROM datos WHERE CUADRANTE='" + cuadrante + "'";
            Statement st = CC.createStatement();
            ResultSet rs = st.executeQuery(consulta);
            while (rs.next()) {
                HORA = rs.getString("HORA");
                CALLE1 = rs.getString("CALLE1");
                CALLE2 = rs.getString("CALLE2");
                DELEGACION = rs.getString("DELEGACION");
                DELITO = rs.getString("DELITO");

                hora.addElement(HORA);
                calle1.addElement(CALLE1);
                calle2.addElement(CALLE2);
                delegacion.addElement(DELEGACION);
                delito.addElement(DELITO);

                Dcua.addElement((HORA + " |"
                        + "             " + CALLE1 + ""
                        + "             | " + CALLE2 + " "
                        + "             | " + DELEGACION + " "
                        + "             | " + DELITO));
            }
            for (int i = 0; i < Dcua.size(); i++) {
                ServerA.Write(Dcua.get(i));
            }

            vv.addElement(hora);
            vv.addElement(calle1);
            vv.addElement(calle2);
            vv.addElement(delegacion);
            vv.addElement(delito);
            
           
        } catch (Exception e) {
            ServerA.Write("Error [RMI]" + e.getMessage());
        }
        ServerA.Write("[RMI] Cliente ejecutó método E");
        return vv;        
    }
    
    public void limpiar_E(){
        hora.clear();
        calle1.clear();
        calle2.clear();
        delegacion.clear();
        delito.clear();
    }

    @Override
    public Vector> Dcuad(String CoordX, String CoordY) throws RemoteException {
        limpiar_D();
        try {
            String consulta = "SELECT FECHA, COLONIA, DELITO FROM datos WHERE COORDX='"+CoordX+"' AND COORDY='"+CoordY+"'";
            Statement st = CC.createStatement();
            ResultSet rs = st.executeQuery(consulta);
            while (rs.next()) {
                fecha.addElement(rs.getString("FECHA"));
                colonia.addElement(rs.getString("COLONIA"));
                tipo.addElement(rs.getString("DELITO"));
            }
            Dcoo.addElement(fecha);
            Dcoo.addElement(colonia);
            Dcoo.addElement(tipo);
            
            for (int i = 0; i < fecha.size(); i++) {
                ServerA.Write(fecha.get(i));
            }
            
        } catch (Exception e) {
            ServerA.Write("Error [RMI] método D:"+e.getMessage());
        }
        ServerA.Write("[RMI] Cliente ejecutó método D");
        return Dcoo;
    }
    
    public void limpiar_D(){
        fecha.clear();
        colonia.clear();
        tipo.clear();
    }
}

Ahora código del cliente, sus estructura es la siguiente:



Paquete Frame
Ventana_D.java


package Frame;

import static Frame.Ventana_E.info;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Jony
 */
public class Ventana_D extends javax.swing.JFrame {

    /**
     * Creates new form Ventana_D
     */
    Vector fecha = new Vector();
    Vector colonia = new Vector();
    Vector tipo = new Vector();
    String coord_x, coord_y;
    public Ventana_D(Vector> Coord) {
        initComponents();
        setLocationRelativeTo(this);
        limpiar();
        fecha = Coord.get(0);
        colonia = Coord.get(1);
        tipo = Coord.get(2);
    }
    
    public void limpiar(){
        fecha.clear();
        colonia.clear();
        tipo.clear();        
    }

    public void visualizar(){
        DefaultTableModel modelo = (DefaultTableModel) Tabla_D.getModel();
        if(!fecha.isEmpty()){
            info.setText(fecha.size()+" datos recuperados de entre la cordenada X:"+coord_e()[0]+"  Y:"+coord_e()[1]);
            for (int i = 0; i //GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        Tabla_D = new javax.swing.JTable();
        info = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        Tabla_D.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "FECHA", "COLONIA", "DELITO"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPane1.setViewportView(Tabla_D);

        info.setForeground(new java.awt.Color(255, 0, 0));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(info, javax.swing.GroupLayout.DEFAULT_SIZE, 553, Short.MAX_VALUE)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 553, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(info, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 166, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(30, 30, 30))
        );

        pack();
    }// 
//GEN-END:initComponents /** * @param args the command line arguments */ public static void main(String args[]) { /* Set the Nimbus look and feel */ // /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(Ventana_D.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(Ventana_D.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(Ventana_D.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(Ventana_D.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } // /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { //new Ventana_D().setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTable Tabla_D; private javax.swing.JLabel info; private javax.swing.JScrollPane jScrollPane1; // End of variables declaration//GEN-END:variables } 

Ventana_E.java

package Frame;

import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Jony
 */
public class Ventana_E extends javax.swing.JFrame {

    /**
     * Creates new form Ventana_E
     */
    Vector hora = new Vector();
    Vector calle1 = new Vector();
    Vector calle2 = new Vector();
    Vector delegacion = new Vector();
    Vector delito = new Vector();

    Vector> cuadran = new Vector>();
    String cuad="";
    public Ventana_E(Vector> cuadran) {
        initComponents();
        setLocationRelativeTo(this);
        limpiar();
        hora = cuadran.get(0);
        calle1 = cuadran.get(1);
        calle2 = cuadran.get(2);
        delegacion = cuadran.get(3);
        delito = cuadran.get(4);
        this.setTitle("DATOS RECUPERADOS DEL SERVIDOR RMI");
    }
    public void limpiar(){
        hora.clear();
        calle1.clear();
        calle2.clear();
        delegacion.clear();
        delito.clear();
        cuadran.clear();
    }

    public void visualizar() {
        DefaultTableModel modelo = (DefaultTableModel) Tabla_E.getModel();
        if (!hora.isEmpty()) {
            info.setText(hora.size() + " registros recuperados del cuadrante: "+cuadrante_e());
            for (int i = 0; i < hora.size(); i++) {
                modelo.addRow(new String[]{hora.get(i), calle1.get(i), calle2.get(i), delegacion.get(i), delito.get(i)});
            }
            setVisible(true);
        } else {
            info.setText("No hay datos");
            JOptionPane.showMessageDialog(null, "No se encontraron datos", "Información", 2);
        }
        
        hora.clear();
        calle1.clear();
        calle2.clear();
        delegacion.clear();
        delito.clear();
    }

    public void cuadrante_r(String cuad){
        this.cuad = cuad;        
    }
    
    public String cuadrante_e(){
        return cuad;
    }
    @SuppressWarnings("unchecked")
    // //GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        Tabla_E = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        Tabla_E.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "HORA", "CALLE 1", "CALLE 2", "DELEGACION", "DELITO"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPane1.setViewportView(Tabla_E);

        info.setForeground(new java.awt.Color(255, 51, 0));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 687, Short.MAX_VALUE)
                    .addComponent(info, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(info, javax.swing.GroupLayout.DEFAULT_SIZE, 22, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 283, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// //GEN-END:initComponents

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Ventana_E.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Ventana_E.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Ventana_E.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Ventana_E.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //
        //
// // /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { // new Ventana_E().setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTable Tabla_E; public static final javax.swing.JLabel info = new javax.swing.JLabel(); private javax.swing.JScrollPane jScrollPane1; // End of variables declaration//GEN-END:variables }

Paquete client_rpc.rmi 
Client_RPCRMI.java


package client_rpc.rmi;

import Frame.Ventana_D;
import Stub.Stub;
import Frame.Ventana_E;
import java.io.IOException;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Scanner;
import java.util.Vector;
import org.apache.xmlrpc.XmlRpcClient;

/**
 *
 * @author Ivan Luis Jimenez
 */
public class Client_RPCRMI {

    public static void main(String[] args) throws IOException {
        Write("Conectando . . .");
        int estado = conectar_A();
        if (estado == 3) {
             Write("Finalizó correctamente");
        } else {
            if(estado == 2){
                int estado2 = conectar_B();
                if(estado2 == 3){
                    Write("Finalizó correctamente");
                }else{
                    
                }
            }
           
        }
    }

    public static int conectar_A() {
        int estado = 0;
        String ruta_RPC = "http://localhost:81/";
        String ruta_RMI = "rmi://localhost:1099/ServerRMI";
        try {
            XmlRpcClient cliente = new XmlRpcClient(ruta_RPC);
            Registry reg = LocateRegistry.getRegistry("localhost", 1099);
            Stub cliente2 = (Stub) Naming.lookup(ruta_RMI);
            estado = 5;
            Write("Conectado a servidor A");
            /*
             *Vectores para almacenar los argumentos a enviar al servidor RPC
             */
            Vector entero = new Vector();
            Vector cadena = new Vector();
            Vector resultados = new Vector();

            /*
             *Vectores para almacenar los resultados de RMI
             */
            Vector> cuadran = new Vector>();
            Vector> coxy = new Vector>();

            /*
             *Atributos para leer del teclado para el menú
             */
            Scanner opcion1 = new Scanner(System.in);
            Scanner opcion2 = new Scanner(System.in);
            int op1 = 0;

            while (!(op1 == 3)) {
                if (op1 == 3) {
                    estado = 3;
                }
                Write("Seleccione la opción deceada\n [3] para salir"
                        + "\n Servidor RPC (1)"
                        + "\n Servidor RMI (2)");
                op1 = Integer.parseInt(opcion1.nextLine());
                /*
                 /RPC
                 */
                if (op1 == 1) {
                    Write("Conectado a Servidor RPC");
                    Write("Servidor RPC:\nSeleccione la opción deceada:"
                            + "\n (A) Tres delegaciones con mayor número de delitos en un año\n"
                            + "determinado."
                            + "\n (B) Número de delitos en una delegación determinada y de un tipo de delito\n"
                            + "determinado."
                            + "\n (C) Mes del año con mayor número de un delito determinado");
                    String op2 = opcion2.nextLine();
                    if (op2.equals("A")) {
                        Write("Teclee el año:");
                        int elemento = opcion2.nextInt();
                        entero.addElement(elemento);
                        Object result = cliente.execute("ServerRPC.mayor_year", entero);
                        resultados = (Vector) result;
                        if (resultados.isEmpty()) {
                            Write("No se encontraron datos");
                        } else {

                            Write("Las tres delegaciones con mayor delito en el año:"+elemento+"\n(A)::" + resultados.get(0)
                                    + "\n(B)::" + resultados.get(1)
                                    + "\n(C)::" + resultados.get(2));

                        }
                        entero.clear();
                        resultados.clear();
                    }
                    if (op2.equals("B")) {
                        Write("Teclee la delegación:");
                        String del = opcion2.nextLine();
                        Write("Teclee el tipo:");
                        String tipo = opcion2.nextLine();
                        cadena.addElement(del);
                        cadena.addElement(tipo);
                        int resuli = 0;
                        Object result = cliente.execute("ServerRPC.num_dele", cadena);
                        resuli = (Integer) result;
                        if (resuli == 0) {
                            Write("No se encontraron datos");
                        } else {
                            Write(cadena.get(0) + " tiene " + resuli + " delitos de " + cadena.get(1));
                        }
                        cadena.clear();
                        resultados.clear();
                    }
                    if (op2.equals("C")) {
                        Write("Teclee el tipo de delito:");
                        String tipo = opcion2.nextLine();
                        cadena.addElement(tipo);
                        String resuli = "";
                        Object result = cliente.execute("ServerRPC.num_del", cadena);
                        resuli = result.toString();
                        if (resuli.equals("Nada") || resuli == null) {
                            Write("No se encontraron datos");
                        } else {
                            Write("El mes con mayor delito de tipo " + tipo+" es:"+resuli);
                        }
                        cadena.clear();
                        resultados.clear();
                    }
                }
                /*
                 *RMI
                 */
                if (op1 == 2) {
                    Scanner read = new Scanner(System.in);
                    Write("Conectado a Servidor RMI");
                    Write("Servidor RMI:\nSeleccione la opción deceada:"
                            + "\n (D) Datos(fecha,colonia,tipo) de una CoordX y CoordY determinada" 
                            + "\n (E) Datos(hora,calles,delegación,tipo) de un cuadrante determinado");
                    String op2 = read.nextLine();
                    if (op2.equals("D")) {
                        Write("Teclee Coordenada X:");
                        String cx = read.nextLine();
                        Write("Teclee Coordenada Y:");
                        String cy = read.nextLine();
                        coxy = cliente2.Dcuad(cx, cy);
                        Ventana_D send = new Ventana_D(coxy);
                        send.coord_r(cx, cy);
                        send.visualizar();
                    }
                    if (op2.equals("E")) {
                        Write("Teclee el cuadrante");
                        String cuadrante = read.nextLine();
                        cuadran = cliente2.Dcoor(cuadrante);

                        Ventana_E send = new Ventana_E(cuadran);
                        send.cuadrante_r(cuadrante);
                        send.visualizar();

                        cuadran.clear();
                    }
                }
            }

        } catch (Exception e) {
            //System.out.println("Error " + e.getMessage());
            Write("No se pudo conectar al servidor A");
            Write("Conectando al servidor B");
            estado = 2;
        }

        return estado;
    }

    public static int conectar_B() {
        int estado = 0;
        String ruta_RPC = "http://192.168.1.66:81/";
        String ruta_RMI = "rmi://192.168.1.66:1099/ServerRMI";
        try {
            XmlRpcClient cliente = new XmlRpcClient(ruta_RPC);
            //Registry reg = LocateRegistry.getRegistry("192.168.1.73", 5000);
            Registry reg = LocateRegistry.getRegistry("192.168.1.66", 1099);
            Stub cliente2 = (Stub) Naming.lookup(ruta_RMI);
            estado =5;
            Write("Conectado a servidor B");
            /*
             *Vectores para almacenar los argumentos a enviar al servidor RPC
             */
            Vector entero = new Vector();
            Vector cadena = new Vector();
            Vector resultados = new Vector();

            /*
             *Vectores para almacenar los resultados de RMI
             */
            Vector> cuadran = new Vector>();
            Vector> coxy = new Vector>();

            /*
             *Atributos para leer del teclado para el menú
             */
            Scanner opcion1 = new Scanner(System.in);
            Scanner opcion2 = new Scanner(System.in);
            int op1 = 0;

            while (!(op1 == 3)) {
                if (op1 == 3) {
                    estado =3;
                }
                Write("Seleccione la opción deceada\n [3] para salir"
                        + "\n Servidor RPC (1)"
                        + "\n Servidor RMI (2)");
                op1 = Integer.parseInt(opcion1.nextLine());
                /*
                 /RPC
                 */
                if (op1 == 1) {
                    Write("Conectado a Servidor RPC");
                    Write("Servidor RPC:\nSeleccione la opción deceada:"
                            + "\n (A) Tres delegaciones con mayor número de delitos en un año\n"
                            + "determinado."
                            + "\n (B) Número de delitos en una delegación determinada y de un tipo de delito\n"
                            + "determinado."
                            + "\n (C) Mes del año con mayor número de un delito determinado");
                    String op2 = opcion2.nextLine();
                    if (op2.equals("A")) {
                        Write("Teclee el año:");
                        int elemento = opcion2.nextInt();
                        entero.addElement(elemento);
                        Object result = cliente.execute("ServerRPC.mayor_year", entero);
                        resultados = (Vector) result;
                        if (resultados.isEmpty()) {
                            Write("No se encontraron datos");
                        } else {

                            Write("Las tres delegaciones son:\n1::" + resultados.get(0)
                                    + "\n2::" + resultados.get(1)
                                    + "\n3::" + resultados.get(2));

                        }
                        entero.clear();
                        resultados.clear();
                    }
                    if (op2.equals("B")) {
                        Write("Teclee la delegación:");
                        String del = opcion2.nextLine();
                        Write("Teclee el tipo:");
                        String tipo = opcion2.nextLine();
                        cadena.addElement(del);
                        cadena.addElement(tipo);
                        int resuli = 0;
                        Object result = cliente.execute("ServerRPC.num_dele", cadena);
                        resuli = (Integer) result;
                        if (resuli == 0) {
                            Write("No se encontraron datos");
                        } else {
                            Write(cadena.get(0) + " tiene " + resuli + " delitos de " + cadena.get(1));
                        }
                        cadena.clear();
                        resultados.clear();
                    }
                    if (op2.equals("C")) {
                        Write("Teclee el tipo de delito:");
                        String tipo = opcion2.nextLine();
                        cadena.addElement(tipo);
                        String resuli = "";
                        Object result = cliente.execute("ServerRPC.num_del", cadena);
                        resuli = result.toString();
                        if (resuli.equals("Nada") || resuli == null) {
                            Write("No se encontraron datos");
                        } else {
                           Write("El mes con mayor delito de tipo " + tipo+" es:"+resuli);
                        }
                        cadena.clear();
                        resultados.clear();
                    }
                }
                /*
                 *RMI
                 */
                if (op1 == 2) {
                    Scanner read = new Scanner(System.in);
                    Write("Conectado a Servidor RMI");
                    Write("Servidor RMI:\nSeleccione la opción deceada:"
                            + "\n (D) Datos(fecha,colonia,tipo) de una CoordX y CoordY determinada" 
                            + "\n (E) Datos(hora,calles,delegación,tipo) de un cuadrante determinado");
                    String op2 = read.nextLine();
                    if (op2.equals("D")) {
                        Write("Teclee Coordenada X:");
                        String cx = read.nextLine();
                        Write("Teclee Coordenada Y:");
                        String cy = read.nextLine();
                        coxy = cliente2.Dcuad(cx, cy);
                        Ventana_D send = new Ventana_D(coxy);
                        send.coord_r(cx, cy);
                        send.visualizar();
                    }
                    if (op2.equals("E")) {
                        Write("Teclee el cuadrante");
                        String cuadrante = read.nextLine();
                        cuadran = cliente2.Dcoor(cuadrante);

                        Ventana_E send = new Ventana_E(cuadran);
                        send.cuadrante_r(cuadrante);
                        send.visualizar();

                        cuadran.clear();
                    }
                }
            }

        } catch (Exception e) {
            //System.out.println("Error " + e.getMessage());
            Write("No se pudo conectar al servidor B");
            estado = 2;
        }
        return estado;
    }

    public static void Write(String msg) {
        System.out.println(msg);
    }

}

Y esto sería prácticamente todo el código del proyecto. Les dejo el link para que descarguen el proyecto, incluye todo lo necesario para probarlo y puedan mejorarlo.

 Descargar

http://raboninco.com/GDH4

EXTRA!!!
Si quieres convertir tu servidor de forma remota o publica, es decir, que este disponible a todo el mundo, de esta manera podrás acceder a el desde cualquier lugar que tenga acceso a Internet, puedes seguir el siguiente link:
 https://ivanovich-hacker.blogspot.com/2019/02/configurar-mi-propio-servidor-web-http.html
También les dejo un video:



Cualquier duda, sugerencia o comentario déjenlo en la parte de abajo. :-)
Se despide su amigo, Ivanovich!Bye! Arrivaderchi! 😊😊

Comentarios

  1. woowww se ve bien padre el cursor con estrellitas

    ResponderBorrar
  2. Hola Amigo una consulta.. por que en el cliente_rpcmi
    //Porque pones en localhost:81 // y el puerto 81 no seria acaso el puerto 80 que es por default?

    String ruta_RPC = "http://localhost:81/";
    String ruta_RMI = "rmi://localhost:1099/ServerRMI";

    Porque en la conexion del mysql esta con el puerto 80 que es por default
    con= DriverManager.getConnection("jdbc:mysql://localhost/sd","root","chkdskshrasd");

    ResponderBorrar
    Respuestas
    1. El puerto 80 por default es para el servidor web, y el 81 para el servidor RPC.

      Borrar
  3. Buenas tardes. La base de datos esta en MySql?

    ResponderBorrar
  4. Como se implemneta la libreria Stub. Buenas tardes

    ResponderBorrar
    Respuestas
    1. Sólo es una clase Remote, dentro de ella están todos los métodos que se quieren hacer remotos, sólo se declaran con los parámetros que se recibirán y retornarán.

      Borrar
  5. Me podrías pasa la librería de org.apache.xmlrpc.

    ResponderBorrar
  6. Buen día,

    No me ha sido posible conectar la BD al programa y tampoco aparece la interfaz grafica en esta... podría por favor explicarme que puedo hacer en este caso?

    ResponderBorrar

Publicar un comentario