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); } } } |