Programación de Red (TCP/IP) con Java

La programación de aplicaciones en red con Java es mucho más simple que la estudiada en C.
Desde el punto de vista de programación orientada a objetos y conceptos de red no hay diferencia con lo ya estudiado.
El aporte de esta sección es el estudio de las clases de Java para programar aplicaciones que usan la red.

Para estudiar estos ejemplos es recomendable tener a la vista la documentación del paquete java.net

Acceso a servidor web vía telnet y cliente Java simple

Con telnet se puede acceder a cualquier servicio en la red, basta usar la opción host  seguido del puerto port:
telnet [-468ELadr] [-S tos] [-b address] [-e escapechar] [-l user] [-n tracefile] [host [port]]
(vea man telnet por otras opciones)

Si por ejemplo usamos:
% telnet www.elo.utfsm.cl 80
y luego escribimos GET / HTTP/1.0

tenemos esto.

Si deseamos hacerlo vía un programa, sería algo como SocketTest.java
 
Las líneas claves del programa son:
Socket s = new Socket("time-A.timefreq.bldrdoc.gov", 13);
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));


La primera crea y abre un socket, el cual es aquí una abstracción para que el programa pueda comunicarse  vía TCP tanto enviando como recibiendo datos a y desde la máquina y puerto indicados.

Para leer datos desde la conexión, Java adapta la entrada de datos del socket con una instancia de InputStreamReader. Luego usa otra clase adaptadora -BufferesReader- para mayor eficiencia en la lectura. Con esto ya se dispone de un objeto sobre el cual podemos leer línea a línea los datos recibos en el socket.

Implementación de un Servidor

En forma análoga al ejemplo visto al inicio de este curso en C, veamos cómo se ve un servidor de eco en Java: EchoServer.java

Para probarlo usted puede correr el cliente escrito en C al comienzo de este curso o nuevamente usar telnet.
En el caso de usar el cliente en C, usted notará un desfase porque el servidor envía un mensaje tan pronto se efectúa una conexión. Esto desincroniza al cliente.
Notar que la invocación a accept() sobre la instancia de SocketServer se retorna una instancia de Socket al estilo del cliente visto en el ejemplo SocketTest.java

Cabe notar que los adaptadores BufferedReader y PrinterWriter no son especiales para la programación de red sino que se pueden usar también para la lectura y escritura a consola o a otros dispositivos de texto como archivos.

¿Cómo atendemos a múltiples clientes?

Estudiar el ejemplo ThreadedEchoServer.java, el cual aplica tanto hilos como sockets.

Cliente/Servidor Simple: Cliente Servidor multi hilos:
Examplo Cliente/Servidor: