Unidad Didáctica 4:
GENERACIÓN DE
SERVICIOS EN RED
4. GENERACIÓN DE SERVICIOS EN RED
Una vez vistas las comunicaciones en Java a través de sockets podemos utilizar
dicho conocimiento para dar un paso más allá y acceder a servicios de red
habituales. En las siguientes secciones desglosamos el funcionamiento de los
protocolos y proporcionamos algunas clases básicas para realizar dichos accesos.
4.1 Protocolos estándar de comunicación en red a nivel de aplicación
El nivel más alto de la pila IP lo componen las aplicaciones que forman el sistema
distribuido. Estas aplicaciones, al igual que en el resto de niveles, ofrecen una
interfaz de servicio para que los usuarios las usen, y disponen de un protocolo de
nivel de aplicación que gobierna las comunicaciones entre ellas. La mayoría de
aplicaciones distribuidas más comunes se ubican en este nivel como las páginas
web, el mail,…
Se define protocolo de nivel de aplicación como el conjunto de reglas que gobiernan
la interacción entre los diferentes elementos de una aplicación distribuida. A la hora
de desarrollar un servicio distribuido, definir este protocolo es uno de los pasos
fundamentales. En una aplicación cliente/servidor este protocolo especifica cómo se
realiza la interacción entre el servidor y los clientes. A su vez, los diferentes
elementos de una aplicación cliente/servidor se pueden ver como sistemas
independientes, con su estructura y función. En este sentido, el servidor es la pieza
clave ya que es la que proporciona el servicio deseado a los clientes. Su estructura
estará formada por los componentes software con los que está programado. Su
función será aquella que realiza para los clientes, y su servicio el procedimiento
mediante el cual la realiza. El protocolo de nivel de aplicación define cómo se
interactúa con el cliente y es la interfaz de servicio del servidor.
FTP (File Transfer Protocol)
FTP es un protocolo de nivel de aplicación diseñado para la transferencia de
archivos a través de una red de comunicaciones. Usa el protocolo de transporte TCP
(sockets stream) para establecer una canal de comunicación entre el cliente y el
servidor. Usa el puerto21.
HTTP (HyperText Transfer Protocol)/HTTPS
HTTP es, probablemente, el protocolo más importante del nivel de aplicación. La
mayoría de tráfico que se realiza en la WWW utiliza este protocolo para controlar la
transferencia de información entre las diferentes
aplicaciones implicadas. Así, este protocolo permite la
transmisión de documentos de hipertexto entre
diferentes aplicaciones ubicadas dentro de una red.
Como el resto de protocolos de aplicación, sigue el
modelo cliente/servidor, y gestiona el paso de mensajes
por el mecanismo de petición/respuesta. Por defecto usa
el puerto 80. Algunos servidores HTTP implementan
mecanismos para almacenar el estado de la sesión (es lo
que hoy en día conocemos como cookies).
HTTPS, es la versión segura del protocolo HTTP, ya que cifra toda la información
intercambiada entre cliente y servidor. El puerto que utiliza es el 443.
No es necesario conocer en profundidad el protocolo HTTP para desarrollar
aplicaciones que realicen comunicaciones en red, pero si es necesario conocer los
tipos de peticiones qu se pueden realizar.
Método Descripción
GET Solicita la recuperación de un recurso. Una petición HTTP que
utiliza este método recupera una entidad alojada en el servidor.
POST Este método se utiliza para crear una entidad alojada en el
servidor.
PUT Este método se utiliza para crear o actualizar una entidad
alojada en el servidor si esta ya existía previamente.
DELETE Elimina una entidad alojada en el servidor.
POP3
Está diseñado para que las aplicaciones clientes de e-mail, accedan a los mensajes
alojados en los servidores de correo electrónico. La mayoría de servidores
comerciales de e-mail soportan este protocolo.
POP3 se basa en el protocolo TCP (sockets stream) y usa
por defecto el puerto 110 para las conexiones sin cifrar y el
puerto 995 para las cifradas.
SMTP (Simple Mail Transfer Protocol)
Es el protocolo de aplicación estándar para el envío de mensajes correo electrónico
en Internet. Todos los mails que circulan en la red es debido a él. Se basa en el
protocolo de transporte TCP (sockets stream) y usa el puerto 25 por defecto.
Otros Protocolos de nivel de aplicación importantes
DHCP (Dynamic Host Configuration Protocol): Asignación dinámicas de las
direcciones IP y de los parámetros de configuración máquinas dentro de una
red. Usa el puerto 67 por defecto.
DNS (Nomain Name Service): Para localizar direcciones IP a partir de
nombre simbólicos. Usa el puerto 53 por defecto.
TELNET: Permite acceder a través de un terminal a un ordenador remoto.
Utiliza el puerto 23.
SSH: Igual que Telnet pero con comunicación cifrada. Puerto 22.
LDAP: Proporciona una estructura jerárquica, ordenada y distribuida de
información, así como las herramientas a la misma. Se suele utilizar para
almacenar la información referente al acceso a los sistemas. Puerto utilizado
por defecto es el 389.
4.2. Técnicas avanzadas de programación de aplicaciones distribuidas
Hoy día, existen multitud de librerías en la gran mayoría de los lenguajes de
programación con los protocolos ya desarrollados, estando al alcance de todos, la
implementación de sus aplicaciones particulares.
Clases y librerías para la creación de servicios en red en java
[Link]
Representa una URL, una referencia a un recurso de la web.
En el siguiente código se muestra la construcción de un objeto de esta clase.
URL url=new URL([Link]
Si la web indicada en el constructor no está correctamente formada, lanzara
la excepción MalformedURLException.
Método Descripción
openConnection Proporciona una conexión(objeto URLConecction a partir
del recurso representado en la URL.
[Link]
Esta clase abstracta es la superclase de todas las clases que representan un
enlace de comunicación entre la aplicación y una URL.
Las instancias de esta clase permiten leer y escribir en el recurso
referenciado por la URL.
HttpURLConnection es la subclase mas relevante.
Método Descripción
getByName Método estático que proporciona la
dirección IP de un host a partir de
su nombre
getLocalHost Método estático que proporciona la
dirección IP del host local
getHostAddress Proporciona la dirección IP del host
getHostName Proporciona el alias del host
getAddress Proporciona la dirección IP del host
como un array de bytes.
getCanonicalHostName Proporciona el nombre del host
getInputStream Proporciona un nombre de lectura
getOutputStream Proporciona un stream de escritura
El siguiente código de ejemplo establece una conexión con un recurso de la web
y se lee su contenido:
URL u = new URL("[Link]
URLConnection urlconnect = [Link]();
InputStream stream = [Link]();
int i;
while ((i = [Link]()) != -1) {
[Link]((char)i);
}
[Link]
Esta clase proporciona los mecanismo para gestionar una conexión HTTP.
Método Descripción
Disconnect Desconecta la conexión
getResponseCode Proporciona el código de retorno
HTTP enviado por el servidor
setRequestMethod Proporciona el método de petición
Contiene también las constantes que representan los códigos de estado del
protocolo HTTP, como por ejemplo,
HttpsURLConnection.HTTP_OK
Que tiene el valor entero 200 y que significa que la petición se ha realizado
correctamente.
[Link]
Esta clase abstracta permite realizar peticiones Http y obtener sus
respuestas. Las instancias han de ser creadas a través de un builder u
objeto de instanciación.
Principales métodos de HttpClient.
Método Descripción
newBuilder Crea un builder(objeto de la interfaz
[Link])
Send Envía la petición HTTP y devuelve una instancia de
HttpResponse. Recibe como parámetro además de la
petición, un objeto de la clase HttpResponse.
BodyHandlers, encargado de gestionar el contenido de
la respuesta de la petición.
Métodos principales de [Link]
Métodos Descripción
Build Proporciona el objeto HttpClient con
la configuración proporcionada.
followsRedirect Proporciona mecanismos para
determinar como debe comportarse
la petición frente a las redirecciones
del servidor.
Version Permite especificar la versión del
protocolo Http
[Link]
Clase abstracta que representa una petición HTTP. Las instancias se
configuran y crean a través de un constructor o builder. Este constructor se
obtiene a través del método estático newBuilder de la propia clase al que se
le indicaran el método de HTTP a utilizar, los parámetros de la petición o el
tiempo limite de espera entre otros parámetros de configuración.
Método mas relevante de HttpRequest
Métodos Descripción
newBuilder Método estático que crea un
builder(objeto de la interfaz
[Link])
Métodos mas relevante de [Link]
Métodos Descripción
build Proporciona el objeto HttpClient con
la configuración proporcionada.
DELETE Asigna el método DELETE al builder.
GET Asigna el método GET al builder
header Permite añadir un par parámetro-
valor a la petición.
headers Permite añadir pares de parámetro-
valor a la petición.
POST Asigna el método POST al builder
PUT Asigna el método PUT al builder.
setHeader Permite asignar un par clave-valor a
la petición
Timeout Permite determinar un tiempo límite
para la petición
uri Asigna la URI a la petición
version Permite especificar la versión del
protocolo HTTP.
[Link]
Interfaz que representa la respuesta de una petición HTTP. Las instancias de
esta interfaz no se crean directamente, sino que son proporcionadas por el
método send de la clase HttpClient
Método mas importante:
Métodos Descripción
statusCode Proporciona el código de estado de la
petición HTTP.
La clase HttpResponse permite obtener instancias de la interfaz funcional
[Link]. Dichas instancias son utilizadas como parámetros en la
llamada al método send de HttpClient y determinan la manera en la que va a
procesarse el cuerpo de la respuesta de la petición Http.
Dispone de diversos métodos estáticos para la obtención de las instancias de
BodyHandler, siendo los mas relevantes:
Métodos Descripción
ofByteArray Método estático. Devuelve un objeto
de tipo BodyHandler<byte[]>
ofFile Método estático. Devuelve un objeto
de tipo BodyHandler<Path>
ofInputStream Método estático. Devuelve un objeto
de tipo BodyHandler<InputStream>
ofString Método estático. Devuelve un objeto
de tipo BodyHandler<String>
La interfaz BodyHandler solo dispone de un único método,apply,que se invoca de
manera automática cuando se utiliza. En función del tipo de clase utilizado este
método realizara una acción u otra.
JavaMail
El API JavaMail proporciona un entrono independiente del protocolo y de la
plataforma para la creación de aplicaciones de mensajería a través del correo
electrónico.
Algunas de las clases mas importantes:
Clase Descripcion
[Link] Representa una carpeta de mensajes
IMAP. Hereda de [Link]
[Link] Representa una carpeta de mensajes
POP3. Hereda de [Link]
[Link] Clase abstracta que representa una
dirección de correo electrónico.
[Link] Clase abstracta que representa una
carpeta de mensajes.
[Link] Clase abstracta que representa un
mensaje de correo electrónico.
[Link] Representa una sesión de correo
electrónico