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

La programación de red con Java es mucho más simple que la estudiada con C.
Desde el punto de vista de programación a objetos y conceptos de red no hay diferencia respecto a 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 via 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 habre 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 envia 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.


Envío de correo

Para enviar correo es posible contactar un servidor SMTP (Simple Mail Transfer Protocol) puerto 25. Dependiendo de su configuración (hoy por los spam sólo aceptan conexiones de quienes ellos confian), será posible enviar correos en forma muy simple. La especificación de SMTP (RFC 821) define cómo comunicarse con el servidor.

Estudiemos el ejemplo MailTest.java

Otros ejemplos se encuentran aquí.