20
2013
Sockets en Java (UDP y TCP) | Ejemplo de compras
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
Han llegado aquí buscando:Ningún usuario a búscado algo parecido en nuestra website
Related Posts
2 Comments + Add Comment
Leave a comment
Encuéntralo aquí
Ayudas!
Entradas recientes
- Photoshop y el retoque fotográfico: La importancia de la imagen en nuestras vidas.
- Mejorar la velocidad en Opencart
- SEO Opencart | Url de la página principal
- Autopublicar en el muro de facebook de tus amigos
- Comprimir web desde cpanel
- Imagen en categorías Opencart
- Automatizar keywords Opencart
- Instalar Opencart
- PopUpTo Share | Opencart
- PopUp to Share | Opencart
- Páginas 404 personalizadas
- Xampp como servidor publico
- Redireccionar web www htaccess | www.dominio.com
- Sustituir una cadena por otra | script bat bacht ms-dos
- Ajustar TextView Android
- Reset password Opencart
- Conocer la ruta completa del servidor web
- Modificar el número de productos que muestra por página
- Problema Captcha Opencart
- Themes Opencart gratuitos
Recientes
- Luciano: Ber. No encuentro lo que pusiste, tanto la aplicacion JAVA para que el movil envie datos cada 20 seg, a una...
- Ber: Pongo los que voy utilizando, si te animas y tienes alguno, enviamelo y lo publicamos. Un saludo,
- luis enrique: estimado tienes batcheros para validar reglas de tipo numéricos, fecha y letras, asi como retirar...
- Ber: Hola, No se muy bien a que te refieres, si me das más detalles. Saludos
- Myri: hola me puedes ayudar me sale una cxudricula en el emulador pero en el telefono me sale q la plicacion no se...
Categorías
- Android (5)
- Bases de datos (75)
- Data Mining (2)
- MySql (3)
- Oracle (62)
- SGBD (4)
- Cajon desastre (4)
- Consolas (5)
- Desarrollo web (87)
- Blogger (1)
- Google Maps (3)
- Opencart (11)
- SEO (10)
- Wordpress (21)
- Ensamblador (13)
- Codigo (7)
- Facebook (API) (13)
- Adsense (1)
- Aplicación Test (1)
- Conectar con Facebook (3)
- Facebook en Español (2)
- Publicar Facebook (4)
- Flash (1)
- Flex (1)
- Forms (2)
- Hardware (18)
- Arquitectura (3)
- Iphone (5)
- Java (24)
- Android (1)
- JavaScript (17)
- ms-dos (1)
- Php (15)
- Proyectos Programación (10)
- Redes (22)
- Software (21)
- Ubuntu (6)
- Vb.net (4)
- Windows (1)
- XML (6)
Hola, disculpa soy nuevo en sockets y en java en general, copie tal cual tu codigo, lo compile en eclipse y me regresa solamente un 0, sin hacer mas nada, en mi caso uso los TCP, podrías ser tan amable de mandarme el codigo funcional de ambas partes (cliente,servidor TCP)
Hola Mario,
Te he dejado un fichero con los sockets, creo que son los que hice para esta práctica. No obstante tienes más sockets hechos con java en la web.
Sobre lo que comentas, fíjate que cuando ejecutes los dos ficheros (Servidor y cliente) en Eclipse, Eclipse te mostrará las dos consolas en las que puedes introducir los comandos, la que debes de utilizar es la del Cliente. La otra, si no mal recuerdo no hace nada.
Saludos