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:

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 aCliente.javapara 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)
}
}


0 comentarios (RSS
) :
Referencias a este artículo:
Página principal