3 Servidores 1 Cliente y 1 Coordinador con sockets por TCP/IP sin búfer en Java
26.10.08. Por ooscarr (ooscarr)Siguiendo con esta serie de códigos java para la comunicación entre servidores, esta vez seguiré utilizando sockets pero ahora con la introducción de un quinto servidor que funcione como coordinador o proxy entre el cliente y los servidores encargados de las operaciones matemáticas.
Como dije, 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.
Los demás códigos:
...se mantienen igual.
Cliente.java
//Librería
import java.io.*;
import java.net.*;
public class Cliente{
//Constructor
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));
//Función principal
public static void main(String args[]) throws IOException{
//Variable que guarda el nombre del servidor coordinador
String IP_COORDINADOR="localhost";// con =null; también funciona
//Variable que guarda el puerto del servidor cordinador
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 host,int puerto,String operacion,String valor1,String valor2){
String respuesta=null;
try {
//System.out.print("Abriendo socket y creando flujos (streams)... ");
Socket sockete = new Socket(host,puerto);
//Creo dos canales de comunicación con la conexión
DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(sockete.getOutputStream()));
DataInputStream entrada = new DataInputStream(new BufferedInputStream(sockete.getInputStream()));
//System.out.println("OK\n");
//Primero digo qué operación deseo realizar
salida.writeUTF(operacion);
//Envío lo que hay en el canal de salida
salida.flush();
//Pongo el valor en el canal de salida
salida.writeUTF(valor1);
//Envío lo que hay en el canal de salida
salida.flush();
//Si desea hacer una potencia
if(operacion.equals("3")){
//Pongo el segundo valor en el canal de salida
salida.writeUTF(valor2);
//Envío lo que hay en el canal de salida
salida.flush();
}
//Leo lo recibido como respuesta por el canal de entrada
respuesta = entrada.readUTF();
//System.out.println("Resultado="+respuesta);
//Se cierra la petición de conexión llamada sockete
try{
sockete.close();
} catch (Exception ex){}
}
catch(Exception e){
System.err.println(e);
}
//Retorna el valor recibido como respuesta
return respuesta;
}
}
Coordinador.java
//Librería
import java.io.*;
import java.net.*;
public class Coordinador{
//Constructor
public Coordinador(){
}
//Función principal
public static void main(String args[]) throws IOException{
//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;
ServerSocket serverSocket=null;
Socket socket=null;
try{
serverSocket =new ServerSocket(PUERTO_COORDINADOR);
} catch (Exception e){
System.err.println("Error al crear socket");
return;
}
while (true){
try{
String respuesta="";
System.out.println("Esperando la conexion de cliente ...");
//Acepto una petición de conexión
socket=serverSocket.accept();
//Creo dos canales de comunicación con la conexión
DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream entrada = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
//Recibo opción desde el cliente
String operacion = entrada.readUTF();
System.out.println(operacion);
System.out.print("Esperando valor 1... ");
//Recibo el valor desde el cliente
String valor1 = entrada.readUTF();
System.out.println(valor1);
if(operacion.equals("1")){
//Si quiere raíz cuadrada
respuesta=realizar_operacion(IP_SQRT,PUERTO_SQRT,valor1,null);
} else if(operacion.equals("2")){
//Si quiere logaritmo natural
respuesta=realizar_operacion(IP_LN,PUERTO_LN,valor1,null);
} else if(operacion.equals("3")){
//Si quiere potencia
System.out.print("Esperando valor 2... ");
//Recibo el exponente desde el cliente
String valor2 = entrada.readUTF();
System.out.println(valor2);
respuesta=realizar_operacion(IP_POTENCIA,PUERTO_POTENCIA,valor1,valor2);
} else{
salida.writeUTF("Error. No está definida la operación solicitada.");
}
System.out.print("Enviando respuesta ("+respuesta+")... ");
//La pongo en el canal de salida
salida.writeUTF(respuesta);
//Se envía
salida.flush();
System.out.println("OK");
//Se cierra la petición de conexión llamada socket
try{
socket.close();
} catch (IOException ex){}
}
catch (Exception e){
System.err.println("Cerrando la conexion del socket ...");
if(socket!=null){
try{
socket.close();
}
catch (IOException ex){}
}
}
}
}
/* Función realizar operacion se encarga de comunicarse con el servidor*/
static String realizar_operacion(String host,int puerto,String valor1,String valor2){
String respuesta=null;
try {
//System.out.print("Abriendo socket y creando flujos (streams)... ");
Socket sockete = new Socket(host,puerto);
//Creo dos canales de comunicación con la conexión
DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(sockete.getOutputStream()));
DataInputStream entrada = new DataInputStream(new BufferedInputStream(sockete.getInputStream()));
//System.out.println("OK\n");
//Pongo el valor en el canal de salida
salida.writeUTF(valor1);
//Envío lo que hay en el canal de salida
salida.flush();
//Si llega un cuarto argumento (el exponente de la potencia)
if(valor2!=null){
//Pongo el valor en el canal de salida
salida.writeUTF(valor2);
//Envío lo que hay en el canal de salida
salida.flush();
}
//Leo lo recibido como respuesta por el canal de entrada
respuesta = entrada.readUTF();
//System.out.println("Resultado="+respuesta);
//Se cierra la petición de conexión llamada sockete
try{
sockete.close();
} catch (Exception ex){}
}
catch(Exception e){
System.err.println(e);
}
//Retorna el valor recibido como respuesta
return respuesta;
}
}


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