Saltar al contenido
Codifíca.me | Desarrollo web | Programación

Cómo crear un Socket TCP en Java

1 octubre, 2012

En este artículo mostramos el código necesario para crear un Socket TCP (Orientado a Conexión) realizado en Java.

Cómo ya sabéis el protocolo TCP está orientado a conexión, para más información podéis ver este link.

Socket TCP

Basicamente, este es el funcionamiento de los Socket que necesitamos para una conexión TCP. En el que podemos distinguir dos tipos de Socket el del Servidor y el del Cliente.

La creación del socket en el servidor se remite a crear el socket, indicar por que puerto se harán las escuchas y esperar a la llamada de un cliente para aceptar la conexión, en cambio un cliente creará el socket e indicará donde se encuentra y por que puerto quiere conectarse, de está forma Cliente y Servidor crearán una conexión.

Servidor:

Para crear los socket se crea un objeto del tipo ServerSocket, este método pertenece a la clase java.net.Serversocket

Una vez que hemos creado el objeto socket mandamos un parámetro que indicará el puerto por el que se realzará las comunicaciones.

Para realizar una conexión entre Cliente-Servidor, el servidor usará el método socket.accept para confirmar que se ha iniciado la conexión.

Cliente:

Primero crea un objeto del tipo Socket que pertenece a la clase java.net.Serversocket,

Después se obtiene un objeto InetAddress, y usando el método getByName le indicamos donde se va a ejecutar el cliente, en nuestro caso indicamos que será en localhost.

Finalmente creamos un objeto de tipo socket al que pasaremos la dirección donde se está ejecutando el cliente, y el puerto por donde se conectará al servidor.

Código del Servidor:

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
 
import java.net.*; //Importa la libreria java.net
import java.io.*;  //Importa la libreria java.io
 
public class servidortcp {
   //se declara una clase de nombre servidortcp
 
	public static void main(String argv[]) {
            //Se declara el método principal main que espera un parámetro
 
		System.out.println("SERVIDOR");
	    ServerSocket socket;   //Se crea un objeto de ServerSocket
      //boolean fin = false; //Se declara una variable booleana inicializada a false
 
 
      try {
    	  //Abrimos una exceptción para el tratamiento de errores
          //Creamos un servidor 
    	  socket = new ServerSocket(6004); //Abre un socket en modo escucha en el puerto 6001
          Socket socket_cli = socket.accept(); //Inicio.Se acepta la conexión.
 
         //Método de la clase socket para recibir datos
         DataInputStream in =
            new DataInputStream(socket_cli.getInputStream());
 
         //Método para mandar un valor al cliente
         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
 
         if (mensaje.startsWith("HELLO")) {
        	 out.writeUTF("HELLO");
         }
 
         do {
 
        	 //Estará escuchando el mensaje sin interrupción debido a la condición (1>0) del while
            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
 
            if (mensaje.startsWith("ALL")) {
 
            	mensaje = "ALL BUR:250;CHE:300; BIG:540; PAT:380; SAL:240; BEV:210; DIE:0; COF:0; DES:300";
            	System.out.println(mensaje);
 
            }
            else if(mensaje.startsWith("BUR"))
            {
            	mensaje = "BUR 250";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("CHE")) {
            	mensaje = "CHE 300";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("BIG")) {
            	mensaje= "BIG 540";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("PAT")) {
            	mensaje= "PAT 380";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("SAL")) {
            	mensaje= "SAL 240";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("BEV")) {
            	mensaje= "SAL 210";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("DIE")) {
            	mensaje= "DIE 0";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("COF")) {
            	mensaje= "COF 0";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("DES")) {
            	mensaje= "DES 300";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("fin")) {
            	mensaje= "fin";
        	    System.out.println(mensaje);
            }
            else{
                mensaje = "ERROR";	
            	System.out.println(mensaje);
            }
 
            //Mandamos al cliente la respuesta de las calorias según lo que ha mandado
                out.writeUTF(mensaje);
            //System.out.println(mensaje); 
 
         } while (1>0);
      }
      catch (Exception e) {
    	  //Si se produce algún error saltará la excepción con el mensaje de error
         System.err.println(e.getMessage());
         System.exit(1); //Salimos con error
      }
   }
}

Código del Cliente:

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
 
import java.net.*; //Se importa la libreria java.net
import java.io.*; //Se importa la libreria java.io
 
//Se declara la clase clientetcp
public class clientetcp {
 
	//Se declara el método principal main que recibe un parámetro
   public static void main(String argv[]) {
 
	   //Si no recibe ningún parámetro dará error
	   if (argv.length == 0) {
         System.err.println("java clientetcp servidor");
         System.exit(1);
      }      
	   System.out.println("CLIENTE");
 
	  // Se guarda en el buffer un valor introducido por pantalla  
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 
      Socket socket=null; //Se crea un objeto de tipo socket
      InetAddress address; //Se crea un objeto de tipo InetAddress
      String mensaje=""; //Se declara una variable de tipo string
 
      try {
             //Se abre una excepción
    	  //Obtiene el nombre de la dirección remota del socket
         address=InetAddress.getByName(argv[0]);
 
         try{
        	 socket = new Socket(address,Integer.parseInt(argv[1])); //Se crea un objeto de tipo socket 
                                            //para establecer una conexión por el puerto 6001
         }catch(NumberFormatException nfe){
        	 System.err.println("El argumento argv[1] no es un numero");
        	 System.exit(1);
         }
 
         //Se declara un objeto de tipo DataOutputStream para mandar valores al servidor 
         DataOutputStream out =
            new DataOutputStream(socket.getOutputStream());
 
         //Se declara un objeto de tipo DataOutputStream para mandar obtener al servidor
         DataInputStream in2 =
             new DataInputStream(socket.getInputStream());
 
         //Mandamos la palabra HELLO al servidor
         out.writeUTF("HELLO");
         //Recogemos lo que nos devuelve el servidor y lo guardamos en la variable mensaje
         mensaje = in2.readUTF();
         System.out.println(mensaje); //Imprime el contenido de mensaje
 
         do {
        	 //Mientras el mensaje no sea fin seguira leyendo
            mensaje = in.readLine();
            out.writeUTF(mensaje);
            //System.out.println(mensaje); //Imprime el contenido de mensaje            
          //NUEVO
            mensaje =""; //Se inicializa la variable de string mensaje a vacío
            mensaje = in2.readUTF();
            System.out.println(mensaje); //Imprime el contenido de mensaje
          //NUEVO            
         } while (!mensaje.startsWith("fin"));
      }
      catch (Exception e) {
         System.err.println(e.getMessage());
         System.exit(1);
      }
   }
}

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Comentarios (9)

Muy buen tutorial me ha ayudado mucho. Gracias

Responder

Gracias por tu comentario, 😉

Responder

Una duda, como aria para enviar y recibir Strings desde sockets en formato ebcdic y ascii… osea, que exista una forma de formatear los datos al momento de enviarlos y recibirlos. Saludos 🙂

Responder

Hola AlkaVegettaRexOMG,
Sinceramente creo que no hice nada así, se que en el blog tienes 4-6 trabajos con sockets, pero no recuerdo que hiciese algo así. Y hace ya bastante tiempo que no toco nada de eso.
Lo pensaré a ver si recuerdo algo parecido…
Saludos!

Responder

Saludos Ber, Muchas gracias.

Responder

Gracias por el comentario 🙂

Responder

Es multi hilos? no llego a entender eso no mas

Responder

Buenas Agustina,
Creo que ninguno de los 6-7 sockets que hay en el blog era multihilos, ya no lo recuerdo bien, pero creo que ninguno era multihilos.
Saludos

Responder

El servidor y cliente presentan un error en

public class servidortcp
public class clientetcp

Hay un error de sintaxis en la linea. Es posible que las sugerencia para el
codigo no fucionen hasta que resuelva este error

Responder