Saltar al contenido

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