En esta práctica de sockets codificados con Java (UDP y TCP) utilizaremos un servidor de venta de tarjetas de transporte, que debe de comportarse como especificamos 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 correremos tanto el cliente como el servidor en la misma máquina virtual.
– Cuando se conecte el cliente enviará al servidor la cadena “HELLO”.
– El servidor la leerá y mostrará por pantalla el mensaje “HELLO”.
– Después le devolverá el saludo a la máquina cliente “HELLO”.
– 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.
– COMP n: Solicitará la compra de una tarjeta de transporte de zonas (1<=n<=5). – ANUL n: Anulará la compra de una tarjeta de transportes de zonas (1<=n<=5). El precio para cada tarjeta de transporte será igual a: – 1 zona: 10 € – 2 zonas:19 € – 3 zonas: 26 € – 4 zonas: 38 € – 5 zonas: 40 € – El servidor, con el comando COMP, incrementará en 1 la lista de solicitudes de compra de tarjetas de transporte. Imprimirá el precio por pantalla y después lo enviará al cliente.
– El servidor, con el comando ANUL comprobará si ha comprado al menos una tarjeta de transporte de esa zona y la anulará, decrimentando 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 tarjetas compradas, las zonas y el precio total. Y finalmente se lo enviará al cliente. (Por ejemplo: TOTAL: 2;1;0;1;0: 77€)
– Para finalizar la conexión, el cliente escribirá el comando “END”, el servidor le responderá con el mismo mensaje al cliente y finalmente cerrará la conexión del programa.
– Despues de cerrar el programa el servidor se quedará a la espera de nuevas solicitudes de otros clientes.
Este es el código del servidor para conexiones TCP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | import java.net.*; //importar la libreria java.net import java.io.*; //importar la libreria java.io // declaramos la clase servidortcp public class servidortcp { // método principal main de la clase public static void main(String argv[]) { // declaramos un objeto ServerSocket para realizar la comunicaci�n ServerSocket socket; // creamos una varible boolean con el valor a false boolean fin = false; // Declaramos un bloque try y catch para controlar la ejecuci�n del subprograma try { // Instanciamos un ServerSocket con la direcci�n del destino y el // puerto que vamos a utilizar para la comunicaci�n socket = new ServerSocket(6162); //Bucle externo necesario para realizar nuevas peticiones do{ // Creamos un socket_cli al que le pasamos el contenido del objeto socket despu�s // de ejecutar la funci�n accept que nos permitir� aceptar conexiones de clientes Socket socket_cli = socket.accept(); // Declaramos e instanciamos el objeto DataInputStream // que nos valdr� para recibir datos del cliente DataInputStream in = new DataInputStream(socket_cli.getInputStream()); // Creamos un bucle do while en el que recogemos el mensaje // que nos ha enviado el cliente y despu�s lo mostramos // por consola DataOutputStream out = new DataOutputStream(socket_cli.getOutputStream()); String mensaje =""; //Se inicializa la variable de string mensaje a vacío mensaje = in.readUTF(); //La variable Mensaje guarda el valor que ha mandado el cliente // Si recibimos HELLO mostramos HELLO if (mensaje.startsWith("HELLO")) { out.writeUTF("HELLO"); } //variables necesarias para llevar la cuenta de compras int comp1, comp2, comp3,comp4, comp5; comp1= comp2= comp3=comp4= comp5= 0; //Iniciamos el bucle do { //Dependiendo de la sentencia que haya enviado el cliente realizaremos una acción mensaje =""; mensaje = in.readUTF(); if (mensaje.startsWith("TOTAL")) { int total= 0; total=comp1*10+comp2*19+comp3*26+comp4*38+comp5*40; System.out.println("TOTAL :"+comp1+";"+comp2+";"+comp3+";"+comp4+";"+comp5+":"+ total ); out.writeUTF("TOTAL :"+comp1+";"+comp2+";"+comp3+";"+comp4+";"+comp5+":"+ total ); } else if (mensaje.startsWith("COMP 1")) { System.out.println(":10 €"); out.writeUTF(":10 €"); ++comp1; } else if (mensaje.startsWith("COMP 2")) { System.out.println(":19 €"); out.writeUTF(":19 €"); ++comp2; } else if (mensaje.startsWith("COMP 3")) { System.out.println(":26 €"); out.writeUTF(":26 €"); ++comp3; } else if (mensaje.startsWith("COMP 4")) { System.out.println(":38 €"); out.writeUTF(":38 €"); ++comp4; } else if (mensaje.startsWith("COMP 5")) { System.out.println(":40 €"); out.writeUTF(":40 €"); ++comp5; } else if (mensaje.startsWith("ANUL 1")) { if (comp1>=1){ System.out.println(":-10 €"); out.writeUTF(":-10 €"); --comp1; } } else if (mensaje.startsWith("ANUL 2")) { if (comp2>=1){ System.out.println(":-19 €"); out.writeUTF(":-19 €"); --comp2; } } else if (mensaje.startsWith("ANUL 3")) { if (comp3>=1){ System.out.println(":-26 €"); out.writeUTF(":-26 €"); --comp3; } } else if (mensaje.startsWith("ANUL 4")) { if (comp4>=1){ System.out.println(":-38 €"); out.writeUTF(":-38 €"); --comp4; } } else if (mensaje.startsWith("ANUL 5")) { if (comp5>=1){ System.out.println(":-40 €"); out.writeUTF(":-40 €"); --comp5; } } else if (mensaje.startsWith("END")) { System.out.println("END"); out.writeUTF("END"); } else { System.out.println("ERROR"); out.writeUTF("ERROR"); } } while (!mensaje.startsWith("END")); socket_cli.close(); } while (1>0); } // utilizamos el catch para capturar los errores que puedan surgir catch (Exception e) { // si existen errores los mostrar� en la consola y despu�s saldr� del // programa System.err.println(e.getMessage()); System.exit(1); } } } |
Este es el código del cliente para conexiones TCP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | import java.net.*; // importar la libreria java.net import java.io.*; // importar la libreria java.io // declararamos la clase clientetcp public class clientetcp { // m�todo principal de la clase public static void main(String argv[]) { // Si no recibe ning�n par�metro escribira esta linea y saldr� // del programa /*if (argv.length == 0) { System.err.println("java clientetcp servidor"); System.exit(1); }*/ // Creamos una instancia BuffererReader en la // que guardamos los datos introducido por el usuario BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); // declaramos un objeto socket para realizar la comunicaci�n Socket socket; // declaramos un objeto de tipo InetAddress para la direcci�n InetAddress address; // declaramos e instanciamos un objeto de tipo byte byte[] mensaje_bytes = new byte[256]; // declaramos una variable de tipo string String mensaje=""; // Declaramos un bloque try y catch para controlar la ejecuci�n del subprograma try { // Obtenemos la direcci�n que el usuario a pasado como argumento address=InetAddress.getByName(argv[0]); // Instanciamos un socket con la direcci�n del destino y el // puerto que vamos a utilizar para la comunicaci�n socket = new Socket("localhost",6162); // Declaramos e instanciamos el objeto DataOutputStream // que nos valdr� para enviar datos al servidor destino DataOutputStream out = new DataOutputStream(socket.getOutputStream()); DataInputStream in2 = new DataInputStream(socket.getInputStream()); //Mandamos la palabra HELLO al servidor out.writeUTF("HELLO"); //devuelve el servidor mensaje = in2.readUTF(); // contenido de mensaje devuelto System.out.println(mensaje); // Creamos un bucle do while en el que enviamos al servidor el mensaje // los datos que hemos obtenido despues de ejecutar la funci�n // "readLine" en la instancia "in" do { mensaje=""; mensaje = in.readLine(); out.writeUTF(mensaje); mensaje = in2.readUTF(); System.out.println(mensaje); } while (!mensaje.startsWith("END")); } // utilizamos el catch para capturar los errores que puedan surgir catch (Exception e) { // si existen errores los mostrar� en la consola y despu�s saldr� del // programa System.err.println(e.getMessage()); System.exit(1); } } } |
Este es el código del servidor para conexiones UDP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | /* * To change this template, choose Tools | Templates * and open the template in the editor. */ import java.net.*; import java.io.*; public class servidorudp { public static void main(String argv[]) { DatagramSocket socket; boolean fin = false; try { socket = new DatagramSocket(6000); byte[] mensaje_bytes = new byte[256]; String mensaje =""; mensaje = new String(mensaje_bytes); String mensajeComp =""; DatagramPacket paquete = new DatagramPacket(mensaje_bytes,256); DatagramPacket envpaquete = new DatagramPacket(mensaje_bytes,256); socket.receive(paquete); mensaje = new String(mensaje_bytes).trim(); //Mostramos el mensaje System.out.println(mensaje); if (mensaje.startsWith("HELLO")) { mensajeComp ="HELLO"; } //Obtenemos el puerto int puerto = paquete.getPort(); //Obtenemos la dirección InetAddress address = paquete.getAddress(); byte[] mensaje2_bytes = new byte[256]; //formateamos el mensaje de salida mensaje2_bytes = mensajeComp.getBytes(); //Preparamos el paquete que vamos a enviar envpaquete = new DatagramPacket(mensaje2_bytes,mensajeComp.length(),address,puerto); // Realizamos el envio socket.send(envpaquete); //variables necesarias para llevar la cuenta de compras int comp1, comp2, comp3,comp4, comp5; comp1= comp2= comp3=comp4= comp5= 0; //Iniciamos el bucle do { // Recibimos el paquete socket.receive(paquete); // Lo formateamos mensaje = new String(mensaje_bytes).trim(); // Lo mostramos por pantalla System.out.println(mensaje); //Dependiendo de la sentencia que haya enviado el cliente realizaremos una acción if (mensaje.startsWith("TOTAL")) { int total= 0; total=comp1*10+comp2*19+comp3*26+comp4*38+comp5*40; System.out.println("TOTAL :"+comp1+";"+comp2+";"+comp3+";"+comp4+";"+comp5+":"+ total ); mensajeComp="TOTAL :"+comp1+";"+comp2+";"+comp3+";"+comp4+";"+comp5+":"+ total; } else if (mensaje.startsWith("COMP 1")) { System.out.println(":10 €"); mensajeComp=":10 €"; ++comp1; } else if (mensaje.startsWith("COMP 2")) { System.out.println(":19 €"); mensajeComp=":19 €"; ++comp2; } else if (mensaje.startsWith("COMP 3")) { System.out.println(":26 €"); mensajeComp=":26 €"; ++comp3; } else if (mensaje.startsWith("COMP 4")) { System.out.println(":38 €"); mensajeComp=":38 €"; ++comp4; } else if (mensaje.startsWith("COMP 5")) { System.out.println(":40 €"); mensajeComp=":40 €"; ++comp5; } else if (mensaje.startsWith("ANUL 1")) { if (comp1>=1){ System.out.println(":-10 €"); mensajeComp=":-10 €"; --comp1; } } else if (mensaje.startsWith("ANUL 2")) { if (comp2>=1){ System.out.println(":-19 €"); mensajeComp=":-19 €"; --comp2; } } else if (mensaje.startsWith("ANUL 3")) { if (comp3>=1){ System.out.println(":-26 €"); mensajeComp=":-26 €"; --comp3; } } else if (mensaje.startsWith("ANUL 4")) { if (comp4>=1){ System.out.println(":-38 €"); mensajeComp=":-38 €"; --comp4; } } else if (mensaje.startsWith("ANUL 5")) { if (comp5>=1){ System.out.println(":-40 €"); mensajeComp=":-40 €"; --comp5; } } else if (mensaje.startsWith("END")) { System.out.println("END"); mensajeComp="END"; } else { System.out.println("ERROR"); mensajeComp="ERROR"; } //formateamos el mensaje de salida mensaje2_bytes = mensajeComp.getBytes(); //Preparamos el paquete que queremos enviar envpaquete = new DatagramPacket(mensaje2_bytes,mensajeComp.length(),address,puerto); // realizamos el envio socket.send(envpaquete); } while (1>0); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(1); } } } |
Este es el código del cliente para conexiones UDP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | /* * To change this template, choose Tools | Templates * and open the template in the editor. */ import java.net.*; import java.io.*; public class clienteudp { public static void main(String argv[]) { if (argv.length == 0) { System.err.println("java clienteudp servidor"); System.exit(1); } BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket socket; InetAddress address; byte[] mensaje_bytes = new byte[256]; String mensaje=""; mensaje_bytes=mensaje.getBytes(); DatagramPacket paquete; String cadenaMensaje=""; DatagramPacket servPaquete; byte[] RecogerServidor_bytes = new byte[256]; try { socket = new DatagramSocket(); address=InetAddress.getByName(argv[0]); mensaje = "HELLO"; mensaje_bytes = mensaje.getBytes(); paquete = new DatagramPacket(mensaje_bytes,mensaje.length(),address,6000); socket.send(paquete); RecogerServidor_bytes = new byte[256]; servPaquete = new DatagramPacket(RecogerServidor_bytes,256); socket.receive(servPaquete); cadenaMensaje = new String(RecogerServidor_bytes).trim(); //Imprimimos el paquete recibido System.out.println(cadenaMensaje); do { mensaje = in.readLine(); mensaje_bytes = mensaje.getBytes(); paquete = new DatagramPacket(mensaje_bytes,mensaje.length(),address,6000); socket.send(paquete); RecogerServidor_bytes = new byte[256]; //Esperamos a recibir un paquete servPaquete = new DatagramPacket(RecogerServidor_bytes,256); socket.receive(servPaquete); //Convertimos el mensaje recibido en un string cadenaMensaje = new String(RecogerServidor_bytes).trim(); //Imprimimos el paquete recibido System.out.println(cadenaMensaje); } while (!mensaje.startsWith("END")); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(1); } } } |
Os dejo el código en un fichero java_sockets.rar