DEPARTAMENTO DE ELÉCTRICA Y ELECTRÓNICA CARRERA DE: INGENIERÍA ELECTRÓNICA EN TELECOMUNICACIONES
ASGINATURA: TECNOLOGÍA DE SOFTWARE PARA ELECTRÓNICA
DEBER 2_2 EJERCICIOS
TUTOR: ING. EVELIO GRANIZO INTEGRANTES: JONATHAN CHASI
FECHA: 2018-12-13 SANGOLQUÍ – ECUADOR
Ejercicio: Utilizar un servidor de venta de entradas al cine, que debe de comportarse como se especifica a continuación: – El cliente enviará como parámetro el nombre de la máquina que actúa como servidor, en este ejemplo será “localhost” ya que se correrá tanto el cliente como el servidor en la misma máquina. – Cuando se conecte el cliente enviará al servidor la cadena “HOLA”. – El servidor la leerá y mostrará por pantalla el mensaje “HOLA”. – Después le devolverá el saludo a la máquina cliente “HOLA”. – El cliente imprimirá por pantalla la cadena. Después del protocolo de saludo entre el cliente y el servidor, el cliente podrá realizar cualquiera de estos comandos o acciones. – TOTAL: Mostrará el número de tarjetas compradas. – COMPRA n: Solicitará la compra de una entrada al cine de tipo (1<=n<=3). – ANULA n: Anulará la compra de una entrada al cine de tipo (1<=n<=3). El precio para cada tarjeta de transporte será igual a: 1 tipo sala VIP : 20 USD 2 tipo butaca : 10 USD 3 tipo general : 5 USD Acciones adicionales del cliente y servidor: – El servidor, con el comando COMPRA, incrementará en 1 la lista de solicitudes de compra de entradas al cine. Imprimirá el precio por pantalla y después lo enviará al cliente. – El servidor, con el comando ANULA comprobará si ha comprado al menos una entrada al cine de ese tipo y la anulará, decrementando en 1 el valor. Mostrará el precio en negativo y se lo enviará al cliente. – El servidor, con el comando TOTAL, creará una cadena con el total de la compra, el número de entradas compradas, los tipos y el precio total. Y finalmente se lo enviará al cliente. (Por ejemplo: TOTAL: 2;1;0;1;0: 40 USD) – Para finalizar la conexión, el cliente escribirá el comando “FIN”, el servidor le responderá con el mismo mensaje al cliente y finalmente cerrará la conexión del programa. – Después de cerrar el programa el servidor se quedará a la espera de nuevas solicitudes de otros clientes.
Código en Java: Servidor: /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package venta_cine;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import static java.lang.Thread.NORM_PRIORITY; import java.net.ServerSocket; import java.net.Socket;
public class Cine_Servidor {
/** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here ServidorCine ServidorCine=new ServidorCine(); }
} class ServidorCine extends Thread { // Constructor ServidorCine() { // Arrancamos el hilo e invocamos al metodo run() para que empiece // a correr start(); } public void run() { try { // Se instancia un objeto sobre el puerto 7 ServerSocket socket = new ServerSocket(1080 ); System.out.println( "Servidor escuchando el puerto 1080" );
// Entramos en bucle infinito ecuchando el puerto. Cuando se // produce una llamada, se lanza un hilo de ejecucion de // ConexionEcho para atenderla while( true ) // Nos quedamos parados en el accept(), y devolvemos un socket // cuando se recibe la llamada. Este socket es el que se pasa // como parametro al nuevo hilo de ejecucion que se crea new ConexionServidor( socket.accept() ); } catch( IOException e ) { e.printStackTrace(); } } } // Esta clase se utiliza el lanzar un hilo de ejecucion que atienda // la llamada recibida a traves del puerto 7, el puerto de eco class ConexionServidor extends Thread { Socket socket; // Constructor ConexionServidor( Socket socket ) { System.out.println( "Recibida una llamada en el puerto 1025" ); this.socket = socket; // Trabajamos por debajo de la prioridad de los otros puertos setPriority( NORM_PRIORITY-1 ); // Se arranca el hilo y se pone a correr start(); } public void run() { System.out.println( "Lanzado el hilo de atencion del puerto 1025" ); BufferedReader entrada = null; PrintWriter salida = null; int cont=0; int cont1=0; int cont2=0;
try { String op; String op1; // Conseguimos un canal de entrada desde el socket entrada = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); // Conseguimos un canal de salida hacia el socket. El canal es // con liberaci�n autom�tica (autoflush) salida = new PrintWriter( new OutputStreamWriter( socket.getOutputStream()),true ); // Recogemos la cadena que llegue al puerto y la devolvemos en // el mismo instante
//Desde aqui empieza el Codigo luego de la conexion String saludo=entrada.readLine(); //Aquie recibe Hola para imprimir y verificar la conexion escribiendo System.out.println("SERVIDOR:"+saludo); salida.println(saludo);
do{ op=entrada.readLine(); switch(op){ case "1": int vol1=cont*20; int vol2=cont1*10; int vol3=cont2*5; int vtotal=vol1+vol2+vol3; int en_total=cont+cont1+cont2; salida.println(Integer.toString(en_total)); salida.println(Integer.toString(cont)); salida.println(Integer.toString(cont1)); salida.println(Integer.toString(cont2));
salida.println(Integer.toString(vtotal)); break;
case "2": cont=cont+1; String precio="$ 20"; salida.println(precio); break;
case "3": cont1=cont1+1; precio="$ 10"; salida.println(precio); break;
case "4": cont2=cont2+1; precio="$ 5"; salida.println(precio); break;
case "5": salida.println(Integer.toString(cont)); if(cont>0){ cont=cont-1; precio="$ 20"; salida.println(precio); break; } precio="No realizó compras en esta sección"; salida.println(precio); break;
case "6": salida.println(Integer.toString(cont1)); if(cont1>0){ cont1=cont1-1; precio="$ 10"; salida.println(precio); break; } precio="No realizó compras en esta sección"; salida.println(precio); break;
case "7": salida.println(Integer.toString(cont2)); if(cont2>0){ cont2=cont2-1; precio="$ 5"; salida.println(precio); break; } precio="No realizó compras en esta sección"; salida.println(precio); break; } op1=entrada.readLine(); if(op1.equals("fin")){ socket.close(); System.out.println("socket cerrado"); } }while(op1.equalsIgnoreCase("1"));//repeticion infinita hasta que ponga fin
} catch( IOException e ) { e.printStackTrace();
} } }
Cliente: package venta_cine; import java.net.*; import java.io.*; import java.util.*;
public class Cine_Cliente { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here String servidor = "localhost"; Scanner leer=new Scanner(System.in); int puerto = 1080; // puerto echo
try { // Abrimos un socket conectado al servidor y al // puerto estandar de echo Socket socket = new Socket( servidor,puerto ); // Conseguimos el canal de entrada BufferedReader entrada =new BufferedReader( new InputStreamReader(socket.getInputStream() ) ); // Conseguimos el canal de entrada PrintWriter salida =new PrintWriter( new OutputStreamWriter(socket.getOutputStream()),true );
//Desde aqui inicia el codigo luego de la conexion String cadena="HOLA";
salida.println(cadena);//enviamos al servidor el saludo //Imprime el HOLA que envia el servidor al cliente System.out.println("CLIENTE:"+entrada.readLine()); //fin de protocolo Saludo String op1; do{ System.out.println("******************"); System.out.println("OPCIONES DEL CINE"); System.out.println("1.- TOTAL Boletos");//COMPRA System.out.println("2.- COMPRA Boleto");//aNULA System.out.println("3.- ANULA Boleto");//TOTAL System.out.println("Digite la opcion requerida"); String op=leer.nextLine(); switch(op){ case "1": salida.println(op); System.out.println("**********************"); System.out.println("DETALLES BOLETOS COMPRADOS"); String total= entrada.readLine(); String cont= entrada.readLine(); String cont1= entrada.readLine(); String cont2= entrada.readLine(); String suma=entrada.readLine(); System.out.println("\nTotal de Entradas:"+total+"\nEntradas Vip:"+cont +"\nEntradas Butaca:"+cont1+"\nEntradas General:"+cont2+"\nValor Total: $ "+suma); break;
case "2": System.out.println("*******************"); System.out.println("Precio de la entrada elegida"); System.out.println("1.-Tipo Sala Vip"); System.out.println("2.-Tipo Butaca");
System.out.println("3.-Tipo General"); System.out.println("Digite la opción a realizar"); String opcion=leer.nextLine(); switch(opcion){ case "1": String aux="2"; salida.println(aux); System.out.println(" "); System.out.println("El valor de la compra es:"+entrada.readLine()); break; case "2": String aux1="3"; salida.println(aux1); System.out.println(" "); System.out.println("El valor de la compra es:"+entrada.readLine()); break; case "3": String aux2="4"; salida.println(aux2); System.out.println(" "); System.out.println("El valor de la compra es:"+entrada.readLine()); break; } break; case "3": System.out.println("******************"); System.out.println("Tipo de compra que desea Eliminar"); System.out.println("1.-Tipo Sala Vip"); System.out.println("2.-Tipo Butaca"); System.out.println("3.-Tipo General"); System.out.println("Digite la opción a realizar"); String opcion1=leer.nextLine(); switch(opcion1){
case "1": System.out.println(" "); String aux3="5"; salida.println(aux3); int x=Integer.parseInt(entrada.readLine()); if(x>0){ System.out.println("El valor de la compra eliminada es:"+entrada.readLine()); break; } System.out.println(entrada.readLine()); break; case "2": String aux4="6"; System.out.println(" "); salida.println(aux4);
;
int y=Integer.parseInt(entrada.readLine()); if(y>0){ System.out.println("El valor de la compra eliminada es:"+entrada.readLine()); break; } System.out.println(entrada.readLine()); break; case "3": String aux5="7"; System.out.println(" "); salida.println(aux5); int z=Integer.parseInt(entrada.readLine()); if(z>0){ System.out.println("El valor de la compra eliminada es:"+entrada.readLine()); break; } System.out.println(entrada.readLine()); break;
} break;
} System.out.println(" "); System.out.println("Elija la opcion: \nVolver al Menu (Digite 1)\nFinalizar la compra (Digite fin)"); op1=leer.nextLine(); salida.println(op1); if(op1.equalsIgnoreCase("fin")){ socket.close(); System.out.println("socket cerrado"); System.out.println("Gracias por usar nuestros servicios"); } }while(op1.equals("1"));
// Cerramos el socket
} catch( UnknownHostException e ) { e.printStackTrace(); System.out.println("Debes estar conectado para que esto funcione bien." ); } catch( IOException e ) { e.printStackTrace(); }
// TODO add your handling code here: } }
Ejecución del programa: Cliente:
Servidor:
Análisis de Resultados: Para realizar el servidor es muy importante hacer varios switch de tal forma de hacer lo indicado en el enunciado, lo importante es usar variables auxiliares para poder poner opciones del 1 al 3, guardando en las variables auxiliares valores del 1 al 7 para poder enviar al cliente y realizar las opciones que debe realizar el cliente. Se uso un modelo TCP para realizar este programa por la facilidad y comprensión del mismo.