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.