3 Servidores 1 Cliente y 1 Coordinador por UDP con búfer en Java

15.11.08. Por ooscarr (ooscarr)

En esta entrega, se realiza lo del coordinador pero mediante buffer por el protocolo UDP.

Como ya se mencionó anteriormente, la única diferencia con el código anterior es que se ha introducido un servidor más entre el cliente y las operaciones como se muestra en la siguiente figura:

Cliente conectado a un Coordinador (5000) que se conecta a Raíz cuadrada (5001), logaritmo natural (5002) y potencia (5003)

El nuevo servidor Coordinador se comunicará con los demás por medio del puerto 5000, al igual como lo hacían los otros 3 servidores con el cliente anteriormente.

Códigos

Básicamente, lo que se hizo fue dividir el código Cliente.java del ejemplo anterior en 2:

Cliente.java
es el programa que se comunica con el usuario y proporciona la interfaz de comunicación con él.
Coordinador.java
que recibe los datos otorgados por Cliente.java, se comunica con el servidor correspondiente de cada operación para obtener el resultado y lo devuelve a Cliente.java para que se la muestre al usuario.

Cliente.java

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Cliente{

 /** Creates a new instance of DataTimeClient */
 public Cliente() {
 }

 /* Se definen cuatro variables que leen DESDE EL TECLADO
  stdin1 para saber si sigue o no
  stdin2 para saber qué función desea realizar
  stdin3 para obtener el valor que quiere resolver
  stdin4 para el exponente, en caso que desea resolver una potencia*/
 private static BufferedReader stdin1 = new BufferedReader(new InputStreamReader(System.in));
 private static BufferedReader stdin2 = new BufferedReader(new InputStreamReader(System.in));
 private static BufferedReader stdin3 = new BufferedReader(new InputStreamReader(System.in));
 private static BufferedReader stdin4 = new BufferedReader(new InputStreamReader(System.in));

 public static void main(String args[]) throws IOException{

  //La dirección del servidor de raíces cuadradas
  String IP_COORDINADOR= "localhost";
  //Puerto del servidor de raíces cuadradas
  int PUERTO_COORDINADOR=5000;

  //Por defecto sí sigue (empieza)
  String sigue="s";

  System.out.println("\nBuenos días");

  //Mientras el usuario siga con ganas de resolver
  while(sigue.equals("s")){
   // Menú
   System.out.println("\n¿Qué desea hacer?\n");
   System.out.println("1. Raíz cuadrada");
   System.out.println("2. Logaritmo natural");
   System.out.println("3. Potencia");
   System.out.println("\n4. Salir");
   System.out.print("\n- Ingrese su opcion: ");
   //Guardo opción en un string para evitar errores
   String opcion=stdin2.readLine();

   if(opcion.equals("1")){
    System.out.println("RAÍZ CUADRADA");
    try{

     //Lee el valor desde teclado
     System.out.print("Raíz cuadrada de: ");
     String valor=stdin3.readLine();

     //Envía el valor a la función de más abajo
     String resultado=realizar_operacion(IP_COORDINADOR,PUERTO_COORDINADOR,opcion,valor,null);

     //Imprime el resultado
     System.out.println("= "+resultado);

    } catch(Exception e){
     System.err.println(e);
    }

   }
   else if(opcion.equals("2")){
    System.out.println("LOGARITMO NATURAL");
    try{

     //Lee el valor desde teclado
     System.out.print("Logaritmo natural de: ");
     String valor=stdin3.readLine();

     //Envía el valor a la función de más abajo
     String resultado=realizar_operacion(IP_COORDINADOR,PUERTO_COORDINADOR,opcion,valor,null);

     //Imprime el resultado
     System.out.println("= "+resultado);

    } catch(Exception e){
     System.err.println(e);
    }

   }
   else if(opcion.equals("3")){
    System.out.println("POTENCIA");
    try{

     //Lee los valores desde teclado
     System.out.print("Base de la potencia: ");
     String base=stdin3.readLine();
     System.out.print("Exponente: ");
     String exponente=stdin4.readLine();

     //Envía el valor a la función de más abajo
     String resultado=realizar_operacion(IP_COORDINADOR,PUERTO_COORDINADOR,opcion,base,exponente);

     //Imprime el resultado
     System.out.println("= "+resultado);

    } catch(Exception e){
     System.err.println(e);
    }

   }
   else if(opcion.equals("4")){
    break;//Opción Salir
   }
   else{
    System.out.println("Se equivocó.");
    break;
   }

   //Sigue el ciclo
   System.out.print("\nDesea realizar otra operación? (s/n): ");
   sigue = stdin1.readLine();
  }
  System.out.println("Adios.");

 }



 /* Función realizar operacion se encarga de comunicarse con el coordinador*/
 static String realizar_operacion(String IP_COORDINADOR,int PUERTO_COORDINADOR,String opcion,String valor1,String valor2){

  //Se define el búfer
        byte[] buf = new byte[256];
  byte[] buf2 = new byte[256];

  DatagramSocket socket;

  String respuesta=null;

  try {
   //Nuevo socket UDP
   socket = new DatagramSocket();

   buf = opcion.getBytes();

   //Se crea el paquete
   DatagramPacket paquete = new DatagramPacket(buf,buf.length,InetAddress.getByName(IP_COORDINADOR),PUERTO_COORDINADOR);
   //Se envía el paquete por el socket
   socket.send(paquete);

   buf = new byte[256];
   buf = valor1.getBytes();
   paquete = new DatagramPacket(buf,buf.length,InetAddress.getByName(IP_COORDINADOR),PUERTO_COORDINADOR);
   socket.send(paquete);

   if(valor2!=null){
    buf = new byte[256];
    buf = valor2.getBytes();
    //Pongo el valor en el paquete de salida
    paquete = new DatagramPacket(buf,buf.length,InetAddress.getByName(IP_COORDINADOR),PUERTO_COORDINADOR);
    //Envío lo que hay en el canal de salida
    socket.send(paquete);
   }

   paquete = new DatagramPacket(buf2,buf2.length);
   //Se espera que llegue el paquete
   socket.receive(paquete);

   respuesta=new String(paquete.getData());
   //System.out.println(respuesta);

   socket.close();

  } catch (IOException ex) {
   ex.printStackTrace();
  }
  //Retorna el valor recibido como respuesta
  return respuesta;
 }
}

Coordinador.java

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Coordinador {

 /** Creates a new instance of DataTimeClient */
 public Coordinador() {
 }

 public static void main(String args[]) {

  //Puerto que se abrirá en esta máquina para responder a los clientes
  int PUERTO_COORDINADOR=5000;

  //Variable que guarda el nombre del servidor de raíz cuadrada
  String IP_SQRT="localhost";// con =null; también funciona
  //Variable que guarda el puerto del servidor de raíz cuadrada
  int PUERTO_SQRT=5001;
  //Variable que guarda el nombre del servidor de logaritmo natural
  String IP_LN="localhost";
  //Variable que guarda el puerto del servidor de logaritmo natura
  int PUERTO_LN=5002;
  //Variable que guarda el nombre del servidor de potencias
  String IP_POTENCIA="localhost";
  //Variable que guarda el puerto del servidor de potencias
  int PUERTO_POTENCIA=5003;

  while (true){
   try{

    String valor1=null;
    String valor2=null;
    String respuesta=null;

    DatagramSocket socket = new DatagramSocket(PUERTO_COORDINADOR);

    byte[] buf = new byte[256];
    DatagramPacket paquete = new DatagramPacket(buf, buf.length);

    System.out.println("Esperando la conexion de cliente ...");

    socket.receive(paquete);
    String operacion=new String(paquete.getData(),0,paquete.getLength());

    InetAddress IP_CLIENTE = paquete.getAddress();
    int PUERTO_CLIENTE = paquete.getPort();

    paquete = new DatagramPacket(buf, buf.length);
    socket.receive(paquete);
    valor1=new String(paquete.getData(),0,paquete.getLength());    

    System.out.print("Operacion "+operacion+" es... ");

    if(operacion.equals("1")){
     //Si quiere raíz cuadrada
     System.out.println("raíz cuadrada.");
     //Envía el valor a la función de más abajo
     respuesta=realizar_operacion(IP_SQRT,PUERTO_SQRT,valor1,null);
     System.out.print("sqrt("+valor1+")");
    } else if(operacion.equals("2")){
     System.out.println("logaritmo natural.");
     //Si quiere logaritmo natural
     respuesta=realizar_operacion(IP_LN,PUERTO_LN,valor1,null);
     System.out.print("ln("+valor1+")");
    } else if(operacion.equals("3")){
     //Si quiere potencia
     System.out.println("potencia.");
     //Recibo el exponente desde el cliente
     System.out.println("Esperando exponente... ");
     paquete = new DatagramPacket(buf, buf.length);
     socket.receive(paquete);     
     valor2=new String(paquete.getData(),0,paquete.getLength());

     respuesta=realizar_operacion(IP_POTENCIA,PUERTO_POTENCIA,valor1,valor2);
     System.out.print(valor1+"^"+valor2);
    } else{
     System.out.println("otra desconocida.");
     respuesta="Error. No está definida la operación solicitada.";
    }

    //Imprime el resultado
    System.out.println(" = "+respuesta);

    System.out.print("Enviando respuesta... ");
    buf = new byte[256];
    buf = respuesta.getBytes();
    paquete = new DatagramPacket(buf, buf.length, IP_CLIENTE,PUERTO_CLIENTE);
    socket.send(paquete);
    System.out.println("OK");

    socket.close();

   } catch(Exception e){
    System.err.println(e);
   }
  }

 }



 /* Función realizar operacion se encarga de comunicarse con el coordinador*/
 static String realizar_operacion(String host,int puerto,String valor1,String valor2){

  //Se define el búfer
  byte[] buf = new byte[256];
  byte[] buf2 = new byte[256];

  String respuesta=null;

  try {
   //Nuevo socket UDP
   DatagramSocket sockete = new DatagramSocket();

   buf = valor1.getBytes();
   //Se crea el paquete
   DatagramPacket paquete = new DatagramPacket(buf,buf.length,InetAddress.getByName(host),puerto);
   //Se envía el paquete por el socket
   sockete.send(paquete);

   //Si llega un cuarto argumento (el exponente de la potencia)
   if(valor2!=null){
    buf = new byte[256];
    buf = valor2.getBytes();
    //Pongo el valor en el paquete de salida
    paquete = new DatagramPacket(buf,buf.length,InetAddress.getByName(host),puerto);
    //Envío lo que hay en el canal de salida
    sockete.send(paquete);
   }

   paquete = new DatagramPacket(buf2,buf2.length);
   //Se espera que llegue el paquete
   sockete.receive(paquete);

   respuesta=new String(paquete.getData());
   //System.out.println(respuesta);

   sockete.close();

  } catch (IOException ex) {
   ex.printStackTrace();
  }
  //Retorna el valor recibido como respuesta
  return respuesta;
 }
}

Sqrt.java

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Sqrt{
 static DatagramSocket socket ;

 //Constructor crea nueva instancia del main
 public Sqrt() {
 }

 public static void main(String[] args) throws IOException{
  int PUERTO_SQRT=5001;

  while(true) {
   try{

    socket = new DatagramSocket(PUERTO_SQRT);

    byte[] buf = new byte[256];
    DatagramPacket paquete = new DatagramPacket(buf, buf.length);

    System.out.println("Esperando para resolver raíces cuadradas...");
    //Se recibe un paquete por el socket
    socket.receive(paquete);
    String valor=new String(paquete.getData(), 0, paquete.getLength());

    System.out.print("Raíz cuadrada de "+valor+" es... ");

    //Creo una instancia de las operaciones definidas
    Operaciones operar=new Operaciones(valor);

    //Realizo la operación
    String resultado=null;
    resultado=String.valueOf(operar.sqrt());
    System.out.println(resultado);

    System.out.print("Enviando resultado... ");
    buf = new byte[256];
    buf = resultado.getBytes();
    InetAddress IP_COORDINADOR = paquete.getAddress();
    int PUERTO_COORDINADOR = paquete.getPort();
    paquete = new DatagramPacket(buf, buf.length, IP_COORDINADOR,PUERTO_COORDINADOR);
    socket.send(paquete);

    System.out.println("OK");

    //Se cierra la petición de conexión llamada socket
    try{
     socket.close();
    }
    catch (Exception ex){
     System.err.println(ex);
    }

   } catch (Exception e){
    System.err.println("Hubo un error.");
    System.err.println(e);
    if(socket!=null){
     System.out.print("Cerrando socket ...");
     try{
      socket.close();
      System.out.println("OK");
     } catch (Exception ex){
      System.out.println("FAIL");
     }
    }
    break;
   }
  }//fin del while(true)
 }

}

Ln.java

es casi igual a Sqrt.java

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Ln{
 static DatagramSocket socket ;
 
 //Constructor crea nueva instancia del main
 public Ln() {
 }
 
 public static void main(String[] args) throws IOException{
  int PUERTO_LN=5002;
  
  while(true) {
   try{

    socket = new DatagramSocket(PUERTO_LN);

    byte[] buf = new byte[256];
    DatagramPacket paquete = new DatagramPacket(buf, buf.length);

    System.out.println("Esperando para resolver logaritmos naturales..");
    //Se recibe un paquete por el socket
    socket.receive(paquete);
    String valor=new String(paquete.getData(), 0, paquete.getLength());

    System.out.print("Logaritmo natural de "+valor+" es... ");

    //Creo una instancia de las operaciones definidas
    Operaciones operar=new Operaciones(valor);

    //Realizo la operación
    String resultado=null;
    resultado=String.valueOf(operar.ln());
    System.out.println(resultado);

    System.out.print("Enviando resultado... ");
    buf = new byte[256];
    buf = resultado.getBytes();
    InetAddress IP_COORDINADOR = paquete.getAddress();
    int PUERTO_COORDINADOR = paquete.getPort();
    paquete = new DatagramPacket(buf, buf.length, IP_COORDINADOR,PUERTO_COORDINADOR);
    socket.send(paquete);

    System.out.println("OK");

    //Se cierra la petición de conexión llamada socket
    try{
     socket.close();
    }
    catch (Exception ex){
     System.err.println(ex);
    }

   } catch (Exception e){
    System.err.println("Hubo un error.");
    System.err.println(e);
    if(socket!=null){
     System.out.print("Cerrando socket ...");
     try{
      socket.close();
      System.out.println("OK");
     } catch (Exception ex){
      System.out.println("FAIL");
     }
    }
    break;
   }
  }//fin del while(true)
 }

}

Potencia.java

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Potencia{
    static DatagramSocket socket ;
 
    //Constructor crea nueva instancia del main
    public Potencia() {
    }
    
    public static void main(String[] args) throws IOException{
  int PUERTO_POTENCIA=5003;

  while(true) {
   try{
    
    socket = new DatagramSocket(PUERTO_POTENCIA);

    byte[] buf = new byte[256];
    DatagramPacket paquete = new DatagramPacket(buf, buf.length);

                System.out.println("Esperando para resolver potencias...");
    //Se recibe un paquete por el socket
                socket.receive(paquete);
    String valor1=new String(paquete.getData(), 0, paquete.getLength());
    
                socket.receive(paquete);
    String valor2=new String(paquete.getData(), 0, paquete.getLength());
    
    System.out.print(valor1+" elevado a "+valor2+" es... ");
    
    //Creo una instancia de las operaciones definidas
    Operaciones operar=new Operaciones(valor1,valor2);
    
    //Realizo la operación
    String resultado=null;
    resultado=String.valueOf(operar.potencia());
    System.out.println(resultado);
    
    System.out.print("Enviando resultado... ");
    buf = new byte[256];
                buf = resultado.getBytes();
                InetAddress IP_COORDINADOR = paquete.getAddress();
                int PUERTO_COORDINADOR = paquete.getPort();
                paquete = new DatagramPacket(buf, buf.length, IP_COORDINADOR,PUERTO_COORDINADOR);
                socket.send(paquete);
    
    System.out.println("OK");
    
    //Se cierra la petición de conexión llamada socket
    try{
     socket.close();
    }
    catch (Exception ex){
     System.err.println(ex);
    }
    
   } catch (Exception e){
    System.err.println("Hubo un error.");
    System.err.println(e);
    if(socket!=null){
     System.out.print("Cerrando socket ...");
     try{
      socket.close();
      System.out.println("OK");
     } catch (Exception ex){
      System.out.println("FAIL");
     }
    }
    break;
   }
  }//fin del while(true)
    }
    
}

Etiquetas: ,

0 comentarios (RSS ATOM) :

Página principal

Publicidad