Download Programación de aplicaciones en red

Document related concepts
no text concepts found
Transcript
Programación para redes
con Java
Jorge Eduardo Ibarra Esquer
Programación para redes
Clases en java.net
Protocolos
Sockets
Datagramas
Aplicaciones cliente-servidor
1
Programación para redes
Java presenta de forma estándar
para todas las plataformas y
sistemas operativos, un conjunto de
clases que permiten la comunicación
entre aplicaciones que se ejecutan
en distintas computadoras.
Programación para redes
El paquete java.net del API de Java
incluye las clases necesarias para
establecer conexiones, crear servidores,
enviar y recibir datos, y para el resto de
operaciones utilizadas en las
comunicaciones a través de redes de
computadoras.
Servlets
RMI
Java IDL.
2
Fundamentos de TCP/IP
El Protocolo de Control de Transmisión y
Protocolo de Internet (TCP/IP) se define
como un grupo de protocolos que permite
que dos aplicaciones en dos nodos de una
red se comuniquen y compartan
información.
Fundamentos de TCP/IP
TCP/IP se organiza como capas de
subprotocolos, cada uno con sus
funciones específicas que en conjunto
proporcionan la funcionalidad apropiada
para lograr la comunicación de datos.
3
Las capas de TCP/IP
Aplicación
Transporte
Red
Enlace
Aplicación: Se compone de
protocolos para
aplicaciones específicas
Transporte: Proporciona
un medio de transmisión a
la aplicación
Red: Lleva los paquetes a
través de la red (IP)
Enlace: Controladores y
hardware
Protocolos (Transporte)
TCP: Es la parte del grupo que hace
confiable a IP. Garantiza que los datos
lleguen a su destino y se reciban
correctamente. Orientado a conexión.
UDP: Actúa como un medio de
broadcasting. Envía paquetes de datos
(datagramas) de una aplicación a otra.
4
Protocolos (Red)
IP: Es responsable del movimiento de
los datagramas entre dos puntos.
ICMP (Internet Control Message
Protocol): Maneja mensajes internos de
control y error entre ruteadores y
computadoras.
IGMP (Internet Group Management
Protocol)
Protocolos (Enlace)
ARP (Address Resolution Protocol):
Convierte direcciones IP a direcciones
de hardware.
RARP (Reverse ARP)
5
Protocolos (Aplicación)
HTTP (Protocolo de Transferencia de
Hipertexto).
IIOB (Internet Inter-ORB Protocol):
Comunicación entre objetos en la red.
RMI (Remote Method Invocation)
FTP (Protocolo de Transferencia de
Archivos)
El paquete java.net
El paquete java.net del API de Java
incluye las clases necesarias para
establecer conexiones, crear
servidores, enviar y recibir datos, y
para el resto de operaciones
utilizadas en las comunicaciones a
través de redes de computadoras.
6
Cuando se escriben programas Java
que se comunican a través de la red,
se está programando en la capa de
aplicación. Para la elaboración de
dichos programas, se pueden utilizar
las clases del paquete java.net
7
URL
URL es un acrónimo que viene de
Uniform Resource Locator y es
una referencia (una dirección) a un
recurso de Internet.
8
URL
http://www.uabc.mx:80/documentos/index.html
Protocolo
Host
Puerto
Ruta al archivo
Recurso
Clase java.net.URL
Constructor Summary
URL(String spec)
Creates a URL object from the String representation.
URL(String protocol, String host, int port, String file)
Creates a URL object from the specified protocol, host, port number, and file.
URL(String protocol, String host, int port, String file, URLStreamHandler handler)
Creates a URL object from the specified protocol, host, port number, file, and
handler.
URL(String protocol, String host, String file)
Creates a URL from the specified protocol name, host name, and file name.
URL(URL context, String spec)
Creates a URL by parsing the given spec within a specified context.
URL(URL context, String spec, URLStreamHandler handler)
Creates a URL by parsing the given spec with the specified handler within a
specified context.
9
Crear una URL
Escribir un programa en Java que
reciba una URL desde la línea de
comando y cree un objeto del tipo URL
Crear una URL relativa
Escribir un programa en Java que reciba una
URL desde la línea de comando y varios
archivos. Cree un objeto del tipo URL y a
partir de éste, uno por cada uno de los
archivos proporcionados.
10
MalformedURLException
Cada uno de los constructores de URL
lanza una MalformedURLException si
los argumentos del constructor son
nulos o el protocolo es desconocido.
Típicamente, se querrá capturar y
manejar esta excepción.
MalformedURLException
Normalmente se deberá introducir el
constructor de URL en un par try/catch.
try {
URL myURL = new URL(. . .)
}
catch (MalformedURLException e)
{
. . . // Aquí va el código del manejador de excepciones
...
}
11
Capturar Excepciones al crear
una URL
Agregar a los programas anteriores la
captura y manejo de excepciones que
sean necesarias.
Nota:
Las URLs son objetos de "una sóla
escritura". Una vez que se ha creado
un objeto URL no se puede cambiar
ninguno de sus atributos (protocolo,
nombre del host, nombre del archivo
ni número de puerto).
12
Analizar una URL
La clase URL proporciona varios
métodos que permiten preguntar a
los objetos URL. Puede obtener el
protocolo, nombre de host, número
de puerto, y nombre de archivo de
una URL utilizando estos métodos
accesorios.
Analizar una URL
getProtocol() Devuelve el identificador
de protocolo de la URL.
getHost() Devuelve el nombre del host
de la URL.
getPort() Devuelve el número del puerto
de la URL.
getFile() Devuelve el nombre de archivo
de la URL.
getRef() Obtiene la referencia de la URL.
13
Analizar una URL
Escribir un programa que cree una URL
a partir de un argumento de la línea de
comando y obtenga cada uno de sus
componentes.
Leer desde una URL
Después de haber creado satisfactoriamente
una URL, se puede llamar al método
openStream() de la clase URL para
obtener un canal desde el que poder leer el
contenido de la URL. El método regresa un
objeto java.io.InputStream por lo que se
puede leer normalmente de la URL
utilizando los métodos normales de
InputStream.
14
Leer desde una URL
BufferedReader buf=new BufferedReader(new
InputStreamReader(unaURL.openStream( )));
String inputLine;
while ((inputLine = buf.readLine()) != null)
{
System.out.println(inputLine);
}
buf.close();
Leer desde una URL
Escribir un programa que cree una
URL, lea un archivo HTML y lo muestre
en la pantalla.
15
Conectar con una URL
Si se ha creado satisfactoriamente
una URL, se puede llamar al método
openConnection() de la clase URL
para conectar con ella. Al conectarse
con una URL se habrá inicializado un
enlace de comunicación entre un
programa Java y la URL a través de
la red.
Conectar con una URL
try {
URL yahoo = new URL("http://www.yahoo.com/");
URLConnection
yahooCon=yahoo.openConnection();
}
catch (MalformedURLException e)
{ // nueva URL() fallida . . .}
catch (IOException e)
{
// openConnection() fallida
. . .}
16
Conectar con una URL
Si es posible, el método openConnection()
crea un nuevo objeto URLConnection, lo
inicializa, conecta con la URL y devuelve el
objeto URLConnection. Si algo va mal -- por
ejemplo, el servidor de Yahoo está apagado
-- el método openConnection() lanza una
IOException.
La clase URLConnection
Esta clase es la superclase de todas las
clases que representan un enlace de
comunicaciones entre una aplicación y un
URL.
Las instancias de esta clase pueden
utilizarse tanto para leer como para
escribir al recurso referenciado por la URL
17
La clase URLConnection
Los métodos de URLConnection también
pueden utilizarse para inspeccionar las
propiedades del objeto remoto antes de
transportarlo al entorno local.
La clase URLConnection
Algunas de esas propiedades las podemos
obtener con estos métodos:
getContentEncoding
getContentLength
getContentType
getDate
getExpiration
getLastModifed
18
Leer desde un URL con
URLConnection
Para leer datos desde una conexión a un
URL, debemos obtener una referencia al
flujo de entrada:
URLConnection conexion = url.openConnection();
BufferedReader dis = new BufferedReader(new
InputStreamReader(conexion.getInputStream()));
Leer desde una URL con
URLConnection
Escribir un programa que se conecte a
una URL, obtenga sus propiedades, lea
su contenido y lo muestre en la
pantalla.
19
Escribir a un URL
Muchas páginas HTML contienen formas
que permiten introducir datos en el
servidor. Después de teclear la
información requerida e iniciar la petición
pulsando un botón, el navegador que se
utiliza escribe los datos en la URL a través
de la red. Después, la otra parte de la
conexión los procesa, y envía de vuelta
una respuesta, normalmente en la forma
de una nueva página HTML.
Escribir a un URL
Los programas Java también pueden
interactuar con los scripts del lado
del servidor. Sólo deben poder
escribir a una URL, así proporcionan
los datos al servirdor. Un programa
puede hacer esto siguiendo los
siguientes pasos:
20
Escribir a un URL
Crear un URL
Abrir una conexión con el URL
Obtener el flujo de salida sobre la
conexión. Este canal de salida está
conectado al canal de entrada estándar
del script
Escribir en el flujo de salida
Cerrar el flujo de salida
Escribir a un URL
Para obtener el flujo de salida, hacemos lo
siguiente:
conexion.setDoOutput(true);
PrintStream outStream = new
PrintStream(conexion.getOutputStream());
outStream.println(“Cadena codificada”);
outStream.close();
21
Escribir a un URL
Los datos que se envíen al URL deben estar
codificados. Por ejemplo, la cadena “Dos
palabras” se codificará como “Dos+Palabras”
Para codificar una cadena, utilizamos el método
encode de la clase URLEncoder
String cadenaEnc=URLEncoder.encode(cadena,”UTF-8”);
Escribir a un URL
Los datos se envían como pares
variable=valor de la siguiente forma:
?var1=valor1&var2=valor2&…
22
Escribir a un URL
Escribir un programa que envíe datos a
un script en un servidor web y que
muestre la respuesta del servidor en la
pantalla
http://yaqui.mxl.uabc.mx/~jorgeeie/practicas/script.php?
nombre=Jorge+Ibarra&email=jorgeeie%40uabc.mx
La clase HttpURLConnection
Esta clase extiende a la clase
URLConnection, a la vez que agrega
atributos y métodos adecuados para
trabajar con el protocolo HTTP
23
La clase HttpURLConnection
Métodos:
setRequestMethod(String method);
El método puede ser alguno de:
GET, POST, PUT, OPTIONS, DELETE,
HEAD o TRACE
La clase HttpURLConnection
Métodos:
int getResponseCode();
El código de respuesta del servidor puede
ser, entre otros:
HTTP_OK
HTTP_NOT_FOUND
HTTP_FORBIDDEN
24
La clase HttpURLConnection
Para crear una instancia de esta clase,
hacemos lo siguiente:
HttpURLConnection conexion;
conexion= (HttpURLConnection)url.openConnection();
Escribir a un URL con
HttpURLConnection
Escribir un programa que envíe datos a un
script en un servidor web y que cree un objeto
a partir de la respuesta del servidor.
http://yaqui.mxl.uabc.mx/~jorgeeie/practicas/persona.php?
nombre=Jorge+Ibarra&email=jorgeeie%40uabc.mx&edad=27
&estatura=1.70
25
Sockets
Las URLs y URLConnections se utilizan para
comunicarse a través de la red a un nivel
relativamente alto y para un propósito
específico: acceder a los recursos de Internet.
Algunas veces los programas requieren una
comunicación en la red a un nivel más bajo, por
ejemplo, cuando se quiera escribir una
aplicación cliente-servidor.
Sockets
En aplicaciones cliente-servidor, el
servidor proporciona algún servicio, como
procesar consultas a bases de datos. El
cliente utiliza el servicio proporcionado
por el servidor para algún fin.
La comunicación que ocurre entre el
cliente y el servidor debe ser fiable -- los
datos no pueden perderse y deben llegar
al cliente en el mismo orden en el que
fueron enviados.
26
Sockets
Un socket es un punto final en un
enlace de comunicación de dos vías
entre dos programas que se
ejecutan en la red.
Las clases Socket son utilizadas
para representar conexiones entre
un programa cliente y otro
programa servidor.
Sockets
El paquete java.net proporciona dos
clases -- Socket y ServerSocket -que implementan los lados del
cliente y del servidor de una
conexión, respectivamente.
27
Sockets
Si se está programando un cliente,
se puede abrir un Socket de la
siguiente forma:
Socket socketCliente;
socketCliente = new Socket("máquina", puerto);
Nota: Esto puede arrojar una IOException
Sockets
Para leer datos a través del socket,
obtenemos el flujo de entrada:
BufferedReader in=new BufferedReader(new
InputStreamReader(socket.getInputStream()));
while((cadena=in.readLine())!=null)
System.out.println(cadena);
28
Sockets
Para escribir datos a través del
socket, obtenemos el flujo de salida:
PrintStream out = new
PrintStream(socket.getOutputStream());
out.print(cadena);
import java.io.*;
import java.net.*;
public class SocketWhois
{
public static void main(String[] args) throws Exception
{
String cadena;
Socket s=new Socket("internic.net",43);
BufferedReader in=new BufferedReader(new
InputStreamReader(s.getInputStream()));
PrintStream out = new PrintStream(s.getOutputStream());
String str=(args.length==0?"osborne.com":args[0])+"\n";
out.print(str);
while((cadena=in.readLine())!=null)
System.out.println(cadena);
}
}
29
Sockets
Si se está programando un servidor,
se puede abrir un Socket de la
siguiente forma:
ServerSocket socketServidor;
socketServidor = new ServerSocket(puerto);
Nota: Esto puede arrojar una IOException
Sockets
También es necesario crear un
Socket para las conexiones de los
clientes:
Socket socketCliente = null;
try {
socketCliente = socketServidor.accept();
}
catch (IOException ioe) {
System.out.println(ioe);
}
30
Sockets
Para leer datos a través del socket,
o escribir en él, se obtienen los
flujos de entrada y salida para el
socket del cliente.
Sockets
Para escribir datos a través del
socket, obtenemos el flujo de salida:
PrintStream out = new
PrintStream(socket.getOutputStream());
out.print(cadena);
31
Socket en el servidor
Escribir un programa que funcione
como un servidor de echo.
ServerSocket echoServer = null;
Socket clientSocket = null;
echoServer = new ServerSocket(9999);
clientSocket=echoServer.accept();
Sockets
El ejemplo anterior solo puede
aceptar a un cliente. Para aceptar
varias conexiones, se debe iniciar un
hilo (Thread) en el servidor para
cada una de ellas.
32
Socket en el servidor
Escribir un programa que funcione
como un servidor de echo y que
acepte conexiones de múltiples
clientes
Socket en el servidor
Escribir un programa que funcione
como un servidor http y que acepte
conexiones de múltiples clientes. El
servidor solamente aceptará
solicitudes de la forma
GET archivo HTTP/1.1
33
Datagramas
No todas las aplicaciones que se escriban
para comunicarse sobre una red requieren
el canal confiable proporcionado por TCP.
De hecho, esas aplicaciones podrían
beneficiarse de un modo de comunicación
que entregue paquetes de información
independientes sin tener garantizada su
llegada ni el orden en que lleguen.
Datagramas
El protocolo UDP proporciona un medio de
comunicación en red donde las
aplicaciones intercambian paquetes de
datos llamados datagramas.
34
Datagramas
Un datagrama es un mensaje
independiente enviado a través de la red y
del cual no se garantizan su llegada,
tiempo de llegada ni contenido.
Datagramas
El paquete java.net contiene dos clases
que permiten escribir programas que
utilicen datagramas:
DatagramPacket
DatagramSocket
además de la clase MulticastSocket, que
permite enviar un paquete a varios
receptores.
35
Cliente y servidor de
datagramas
Escribir un cliente y un servidor de
datagramas. El servidor enviará
frases contenidas en un archivo de
texto.
36