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:
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
paquete Frame
Ventana_D.java
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 delitodeterminado.
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.


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<string> tres_del = new Vector<string>();
Vector<string> Delegaciones = new Vector<string>();
int num_del;
String mes;
public Vector<string> 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]<mayor2 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<string> meses = new Vector<string>();
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<vector tring="">> Dcoo = new Vector<vector tring="">>();
Vector<string> Dcua = new Vector<string>();
Vector<vector tring="">> vv = new Vector<vector tring="">>();
/*
*Vectores para método E
*/
Vector<string> hora = new Vector<string>();
Vector<string> calle1 = new Vector<string>();
Vector<string> calle2 = new Vector<string>();
Vector<string> delegacion = new Vector<string>();
Vector<string> delito = new Vector<string>();
/*
*Vectores para método D
*/
Vector<string> fecha = new Vector<string>();
Vector<string> colonia = new Vector<string>();
Vector<string> tipo = new Vector<string>();
public ServerObject_RMI() throws java.rmi.RemoteException {
super();
}
@Override
public Vector<vector tring="">> 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<vector tring="">> 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 el código del cliente, sus estructura es la siguiente:

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<string> fecha = new Vector<string>();
Vector<string> colonia = new Vector<string>();
Vector<string> tipo = new Vector<string>();
String coord_x, coord_y;
public Ventana_D(Vector<vector tring="">> 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 <fecha .size="" 2="" co="" colonia.clear="" colonia.get="" coord_e="" coord_r="" coord_x="" coord_y="" coordx="" coordy="" datos="" defaultstate="collapsed" desc="Generated Code" editor-fold="" else="" encontraron="" fecha.clear="" fecha.get="" hay="" i="" info.settext="" joptionpane.showmessagedialog="" modelo.addrow="" n="" new="" nformaci="" null="" o="" public="" return="" se="" setvisible="" string="" tipo.clear="" tipo.get="" tring="" true="" unchecked="" uppresswarnings="" void="">//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();
}
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<string> hora = new Vector<string>();
Vector<string> calle1 = new Vector<string>();
Vector<string> calle2 = new Vector<string>();
Vector<string> delegacion = new Vector<string>();
Vector<string> delito = new Vector<string>();
Vector<vector tring="">> cuadran = new Vector<vector tring="">>();
String cuad="";
public Ventana_E(Vector<vector tring="">> 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")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//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();
}// </editor-fold>//GEN-END:initComponents
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* 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);
}
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<integer> entero = new Vector<integer>();
Vector<string> cadena = new Vector<string>();
Vector<string> resultados = new Vector<string>();
/*
*Vectores para almacenar los resultados de RMI
*/
Vector<vector tring="">> cuadran = new Vector<vector tring="">>();
Vector<vector tring="">> coxy = new Vector<vector tring="">>();
/*
*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 deceadan [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ñon"
+ "determinado."
+ "n (B) Número de delitos en una delegación determinada y de un tipo de deliton"
+ "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<integer> entero = new Vector<integer>();
Vector<string> cadena = new Vector<string>();
Vector<string> resultados = new Vector<string>();
/*
*Vectores para almacenar los resultados de RMI
*/
Vector<vector tring="">> cuadran = new Vector<vector tring="">>();
Vector<vector tring="">> coxy = new Vector<vector tring="">>();
/*
*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 deceadan [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ñon"
+ "determinado."
+ "n (B) Número de delitos en una delegación determinada y de un tipo de deliton"
+ "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.
Les dejo el link de mi blog para que descarguen el proyecto completo:
Cualquier duda, dejen su comentario.
Bye, Arrivaderchi ;-) ;-)