programación para redes con javayaqui.mxl.uabc.mx/~jorgeeie/java/docs/redes.pdf · 2 programación...

36
1 Programación para redes con Java Jorge Eduardo Ibarra Esquer Programación para redes Clases en java.net Protocolos Sockets Datagramas Aplicaciones cliente-servidor

Upload: buidieu

Post on 15-Sep-2018

237 views

Category:

Documents


0 download

TRANSCRIPT

1

Programación para redescon Java

Jorge Eduardo Ibarra Esquer

Programación para redes

Clases en java.netProtocolosSocketsDatagramasAplicaciones cliente-servidor

2

Programación para redes

Java presenta de forma estándarpara todas las plataformas y sistemas operativos, un conjunto de clases que permiten la comunicaciónentre aplicaciones que se ejecutanen distintas computadoras.

Programación para redes

El paquete java.net del API de Java incluye las clases necesarias paraestablecer conexiones, crear servidores, enviar y recibir datos, y para el resto de operaciones utilizadas en lascomunicaciones a través de redes de computadoras.

ServletsRMI Java IDL.

3

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 permiteque dos aplicaciones en dos nodos de unared se comuniquen y compartaninformación.

Fundamentos de TCP/IP

TCP/IP se organiza como capas de subprotocolos, cada uno con susfunciones específicas que en conjuntoproporcionan la funcionalidad apropiadapara lograr la comunicación de datos.

4

Las capas de TCP/IPAplicación: Se compone de protocolos paraaplicaciones específicasTransporte: Proporcionaun medio de transmisión a la aplicaciónRed: Lleva los paquetes a través de la red (IP)Enlace: Controladores y hardware

Aplicación

Transporte

Red

Enlace

Protocolos (Transporte)

TCP: Es la parte del grupo que haceconfiable a IP. Garantiza que los datoslleguen a su destino y se recibancorrectamente. Orientado a conexión.UDP: Actúa como un medio de broadcasting. Envía paquetes de datos(datagramas) de una aplicación a otra.

5

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 direccionesde hardware.RARP (Reverse ARP)

6

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 paraestablecer conexiones, crearservidores, enviar y recibir datos, y para el resto de operacionesutilizadas en las comunicaciones a través de redes de computadoras.

7

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 utilizarlas clases del paquete java.net

8

URL

URL es un acrónimo que viene de Uniform Resource Locator y esuna referencia (una dirección) a un recurso de Internet.

9

URL

http://www.uabc.mx:80/documentos/index.html

Protocolo Host Puerto Ruta al archivo

Recurso

Clase java.net.URLConstructor 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.

10

Crear una URL

Escribir un programa en Java quereciba 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 unaURL desde la línea de comando y variosarchivos. Cree un objeto del tipo URL y a partir de éste, uno por cada uno de los archivos proporcionados.

11

MalformedURLException

Cada uno de los constructores de URL lanza una MalformedURLException silos 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. . .}

12

Capturar Excepciones al crearuna URL

Agregar a los programas anteriores la captura y manejo de excepciones quesean necesarias.

Nota:

Las URLs son objetos de "una sólaescritura". Una vez que se ha creadoun objeto URL no se puede cambiarninguno de sus atributos (protocolo, nombre del host, nombre del archivoni número de puerto).

13

Analizar una URL

La clase URL proporciona variosmétodos que permiten preguntar a los objetos URL. Puede obtener el protocolo, nombre de host, númerode puerto, y nombre de archivo de una URL utilizando estos métodosaccesorios.

Analizar una URLgetProtocol() 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.

14

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 suscomponentes.

Leer desde una URL

Después de haber creado satisfactoriamenteuna URL, se puede llamar al métodoopenStream() de la clase URL paraobtener 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.

15

Leer desde una URL

BufferedReader buf=new BufferedReader(newInputStreamReader(unaURL.openStream( )));

String inputLine;

while ((inputLine = buf.readLine()) != null) {

System.out.println(inputLine);}buf.close();

Leer desde una URL

Escribir un programa que cree unaURL, lea un archivo HTML y lo muestreen la pantalla.

16

Conectar con una URL

Si se ha creado satisfactoriamenteuna URL, se puede llamar al métodoopenConnection() de la clase URL para conectar con ella. Al conectarsecon 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 . . .}

17

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 -- porejemplo, el servidor de Yahoo está apagado-- el método openConnection() lanza unaIOException.

La clase URLConnection

Esta clase es la superclase de todas lasclases que representan un enlace de comunicaciones entre una aplicación y un URL.Las instancias de esta clase puedenutilizarse tanto para leer como paraescribir al recurso referenciado por la URL

18

La clase URLConnection

Los métodos de URLConnection tambiénpueden utilizarse para inspeccionar laspropiedades del objeto remoto antes de transportarlo al entorno local.

La clase URLConnection

Algunas de esas propiedades las podemosobtener con estos métodos:

getContentEncodinggetContentLengthgetContentTypegetDategetExpirationgetLastModifed

19

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.

20

Escribir a un URLMuchas páginas HTML contienen formasque permiten introducir datos en el servidor. Después de teclear la información requerida e iniciar la peticiónpulsando un botón, el navegador que se utiliza escribe los datos en la URL a travésde la red. Después, la otra parte de la conexión los procesa, y envía de vueltauna respuesta, normalmente en la forma de una nueva página HTML.

Escribir a un URLLos programas Java también puedeninteractuar con los scripts del ladodel servidor. Sólo deben poderescribir a una URL, así proporcionanlos datos al servirdor. Un programapuede hacer esto siguiendo los siguientes pasos:

21

Escribir a un URL

Crear un URLAbrir una conexión con el URLObtener el flujo de salida sobre la conexión. Este canal de salida estáconectado al canal de entrada estándardel scriptEscribir en el flujo de salidaCerrar 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();

22

Escribir a un URL

Los datos que se envíen al URL deben estarcodificados. Por ejemplo, la cadena “Dos palabras” se codificará como “Dos+Palabras”

Para codificar una cadena, utilizamos el métodoencode 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&…

23

Escribir a un URL

Escribir un programa que envíe datos a un script en un servidor web y quemuestre 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 claseURLConnection, a la vez que agregaatributos y métodos adecuados paratrabajar con el protocolo HTTP

24

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 puedeser, entre otros:HTTP_OKHTTP_NOT_FOUNDHTTP_FORBIDDEN

25

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 objetoa 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

26

Sockets

Las URLs y URLConnections se utilizan paracomunicarse a través de la red a un nivelrelativamente alto y para un propósitoespecífico: acceder a los recursos de Internet. Algunas veces los programas requieren unacomunicación en la red a un nivel más bajo, porejemplo, cuando se quiera escribir unaaplicación cliente-servidor.

Sockets

En aplicaciones cliente-servidor, el servidor proporciona algún servicio, comoprocesar consultas a bases de datos. El cliente utiliza el servicio proporcionadopor 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 llegaral cliente en el mismo orden en el quefueron enviados.

27

Sockets

Un socket es un punto final en un enlace de comunicación de dos víasentre dos programas que se ejecutan en la red.Las clases Socket son utilizadas

para representar conexiones entre un programa cliente y otroprograma servidor.

Sockets

El paquete java.net proporciona dos clases -- Socket y ServerSocket --que implementan los lados del cliente y del servidor de unaconexión, respectivamente.

28

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(newInputStreamReader(socket.getInputStream()));

while((cadena=in.readLine())!=null)System.out.println(cadena);

29

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);

}}

30

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);

}

31

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);

32

Socket en el servidor

Escribir un programa que funcionecomo un servidor de echo.

ServerSocket echoServer = null;Socket clientSocket = null;echoServer = new ServerSocket(9999);clientSocket=echoServer.accept();

Sockets

El ejemplo anterior solo puedeaceptar a un cliente. Para aceptarvarias conexiones, se debe iniciar un hilo (Thread) en el servidor paracada una de ellas.

33

Socket en el servidor

Escribir un programa que funcionecomo un servidor de echo y queacepte conexiones de múltiplesclientes

Socket en el servidor

Escribir un programa que funcionecomo un servidor http y que acepteconexiones de múltiples clientes. El servidor solamente aceptarásolicitudes de la forma

GET archivo HTTP/1.1

34

Datagramas

No todas las aplicaciones que se escribanpara comunicarse sobre una red requierenel canal confiable proporcionado por TCP. De hecho, esas aplicaciones podríanbeneficiarse de un modo de comunicaciónque entregue paquetes de informaciónindependientes sin tener garantizada sullegada ni el orden en que lleguen.

Datagramas

El protocolo UDP proporciona un medio de comunicación en red donde lasaplicaciones intercambian paquetes de datos llamados datagramas.

35

Datagramas

Un datagrama es un mensajeindependiente 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 clasesque permiten escribir programas queutilicen datagramas:

DatagramPacketDatagramSocket

además de la clase MulticastSocket, quepermite enviar un paquete a variosreceptores.

36

Cliente y servidor de datagramas

Escribir un cliente y un servidor de datagramas. El servidor enviaráfrases contenidas en un archivo de texto.