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 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.
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
confían), 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í.