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:
-
JabberServer:
Servidor simple que sólo hace eco de lo enviado
por el cliente.-
JabberClient:
Cliente muy simple que sólo envía líneas
hacia el servidor y luedo lee las líneas enviadas por el servidor.
Cliente Servidor multi hilos:
-
MultiJabberServer:
Un servidor que emplea múltiples hilos para manejar
cualquier número de clientes.-
MultiJabberClient:
Cliente que prueba el servidor concurrente. Éste
crea múltiples clientes.
Examplo Cliente/Servidor:
-
Dgram:
Una clase útil para conversiones entre string
y paquetes datagrama (DataGramPackets).-
ChatterServer:
Un servidor que hace eco de datagramas.-
ChatterClient:
Prueba el servidor ChatterServer a través de múltiples
clientes enviando datagramas.