Java para programadores (11.3). Comunicaciones. Sockets de servidor

Para establecer conexión entre dos procesos, deberemos hacer que uno de los participantes inicie el proceso en modo “escucha”, y será al que denominaremos ”Servidor”. La clase ServerSocket, nos permite implementar esta modalidad

Para iniciar la escucha en un puerto deberemos hacer:

El proceso queda parado en el accept() hasta que alguien se conecte, o se produzca un error de timeout. Si lo sucedido es que alguien se ha conectado, en clientSocket tenemos un socket que está unido al cliente, por lo que podremos dar órdenes de lectura y/o escritura a través del mismo

Para entender un poco más estos objetos, vamos a realizar un ejercicio con una clase cliente y otra servidor.

La clase servidor TCP

Primero programaremos el servidor, su funcionalidad será muy sencilla, cuando alguien se conecte, nos informará, recogerá lo que se envíe  y lo imprimirá; a continuación, cerrara la conexión

La clase se llamara ServidorTCPSimple, y empezamos definiendo los literales y las variables que vamos a utilizar

Tenemos el saludo que presentaremos en la consola, el puerto en el que vamos a escuchar, y el tiempo que permaneceremos escuchando. Cuando venza el tiempo de TIMEOUT sin que se haya recibido nada, se generara una excepción.

A continuación, abrimos un socket de servidor y establecemos el TIMEOUT

Como hemos decidido que si no se conecta nadie en esos 10 segundos, queremos seguir esperando,  programaremos dentro de un bucle while(true), del que solo podremos salir por break. El código puede ser:

Notas:

Empezamos comunicando que estamos listos en línea 30

En línea 31 hacemos el accept() con lo que nuestra clase se quedará parada hasta que pase el TIMEOUT, o alguien se conecte, por TIMEOUT, iremos al mensaje de la línea 41 y volveremos a principio de bucle (línea 30)

El accept, nos ha proporcionado un nuevo socket conectado al cliente.

En 32, presentamos datos del cliente conectado

En 33, conseguimos un DataInputStream conectado al cliente, que leemos (in.readUTF) y lo imprimimos en 34

Para poder escribir en el cliente, necesitamos un DataOutputStream que conseguimos en la 35 y en la 36, podemos enviarle un saludo.

Al finalizar, cerramos el servidor, y hacemos break para salir del bucle y cerrar el programa

La clase cliente TCP

La clase cliente (ClienteTCPSimple) tiene que abrir un socket sobre la dirección y puerto del servidor, enviar un mensaje, escuchar la respuesta, imprimirla y finalizar…sencillo

Como siempre empezamos definiendo los literales, que serán el puerto, el mismo de antes (6000), y la dirección del socket remoto; como es en la misma máquina, podemos utilizar la palabra “localhost” que se refiere a la dirección 127.0.0.1 y es un loopback de la tarjeta de red

Como solo vamos a enviar un mensaje y recibir la respuesta, no necesitamos ningún bucle, solo

Conectamos con el servidor

Conseguimos un DataOutputStream, e imprimimos el mensaje en él

A continuación, conseguimos un DataInputStream para recibir cualquier mensaje que transmitan, lo leemos, y lo imprimimos en la consola

Ahora ya podemos cerrar el cliente

 

Si se han añadido los try-catch necesarios, se puede probar, para ello, se lanza primero el servidor, y a continuación el cliente; en la consola debe aparecer algo como:

La experiencia puede ser más interesante si se realiza desde dos ventanas del S.O.

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Formacion, Java y etiquetada , . Guarda el enlace permanente.

Deja un comentario