Programación Orientada a Objetos con Java

Texto completo

(1)

1

Programación

Programación

Orientada a Objetos

Orientada a Objetos

con Java

con Java

Rafael Rivera López

Departamento de Sistemas y Computación Invierno 2005 Veracruz, Ver.

Programa de Formación y

Actualización Docente

2

Temas Avanzados

IV

(2)

3

TCP/IP e Internet

TCP/IP e Internet

IV.2 4

URLs

Protocolo Archivo Host/Computadora Cada pieza de información en la

Web tiene una dirección de identificación única llamada URL

(Uniform Resource Locator).

Ejemplo:

(3)

5

Elementos del URL

•Protocolo: Especifica como será accesada la información.

•Host: Es la máquina (nodo) origen de la información.

•File: Es el archivo que se requiere.

6

Demonio de HTTP

•La información de Internet se almacena en

servidores Web.

•Se accesa a la información disponible con

programas llamados demonios (HTTP-daemon).

•Un HTTPD es una aplicación que está activa en el

servidor y que espera las solicitudes de

(4)

7

Interacción Navegador-HTTPD

host java.sun.com Aplicación de HTTPD Disco Navegador usuario solicita http:// java.sun.com /index.html Solicita /index.html Envía el contenido de index.html 8

Protocolo

9 344101

“Si conoce la extensión, capturela” 5

“Conectando a la extensión solicitada” Un protocolo es un conjunto de reglas que definen el tipo de comunicación:

(5)

9

Base de trabajo en red

La comunicación en red es complicada, por lo que el trabajo se divide

Las funciones de red se dividen en capas. Cada función tiene

asociado un protocolo Ethernet, Token-Ring, ... Enlace IP Red TCP, UDP Transporte HTTP, FTP, Telnet, ... Aplicación Capa Protocolo

TCP/IP es el conjunto de protocolos para comunicación por internet:

10

Capa de Red

Todo host conectado a la Internet tiene asociado una dirección IP (135.17.98.240).

Adicionalmente, toda computadora tiene una dirección local (127.0.0.1) conocido como el localhost

Se puede asociar a cada host un nombre de host (hostname), por

ejemplo java.sun.com

127.0.0.1 localhost

(6)

11

Capa de transporte

Todas las capas son importantes, pero la capa de transporte es la que asegura la entrega de la información

entre hosts

La información que viaja en internet se divide en paquetes de longitud

pequeña, que utilizan la red para viajar

TCP/IP tiene dos protocolos de transporte: TCP y UDP

12

Capa de transporte

Envía paquetes de forma independiente.

No se garantiza el orden de llegada de los paquetes. No verifica el destino (sin conexión)

Más rápido

UDP (Protocolo de datagrama de usuario)

Verifica que el destino reciba los datos (orientado a conexión)

Garantiza un flujo de datos confiable entre dos computadoras.

Mantiene el orden de los paquetes enviados.

(7)

13

¿TCP ó UDP?

Transmisión de Audio Transmisión de video

Se utiliza UDP para:

HTTP (páginas Web)

FTP (Transferencia de archivos remotos) Telnet (Terminal remota)

Se utiliza TCP para:

14

Puertos

Cada host en Internet puede ofrecer varios servicios (internet, copia de archivos, correo) a través de los diferentes protocolos existentes.

Los involucrados deben saber de antemano que tipo de servicio se utilizará.

Un puerto es una abstracción de software que se asocia a cada típo de servicio.

Un puerto es un número de 16 bits que identifica a cada servicio ofrecido por un host (un servidor)

(8)

15

Puertos

Cada destino en Internet es identificado por un host (dirección IP de 32 bits) y un puerto (16 bits).

¿por qué no se especifica un puerto al usar un navegador?

80 25 23 21 HTTP (Transferencia de Hipertexto) Correo

Telnet (conexión remota)

FTP (Transferencia de archivos)

Puerto Protocolo

16

Trabajando con redes

Trabajando con redes

IV.2

(9)

17

El paquete java.net

El paquete java.net proporciona clases

base para trabajar con redes

Contiene clases que admiten la comunicación cliente/servidor basada

en sockets

Proporciona clases para manejar direcciones IP y URL 18

Paquete java.net

Object ServerSocket Socket InetAddress DatagramPacket DatagramSocket URL Para cliente/servidor orientado a conexión Para cliente/servidor sin conexión Para información de una dirección IP Para localizar recursos en Internet

(10)

19

Direcciones IP

Direcciones IP

IV.2 20

Clase InetAddress

Devuelve el nombre del objeto getHostName()

Devuelve la IP del objeto getHostAddress()

Devuelve un objeto InetAddress de un host

getByName(String)

Devuelve un objeto InetAddress de la máquina local

getLocalHost()

Descripción Método

La clase InetAddress representa las direcciones del protocolo IP

(11)

21

Ejemplo

import java.net.*;

public class DireccionIP {

public static void main(String[] args) { try { InetAddress host=InetAddress.getByName("www.itver.edu.mx"); System.out.println("Host="+host); System.out.println("IP="+host.getHostAddress()); System.out.println("Nombre="+host.getHostName()); System.out.println( "Localhost="+InetAdress.getLocalHost()); catch(UnknownHostException ex){ System.err.println("Host desconocido"); System.exit(0); Devuelve un objeto asociado al nombre del

host El nombre del host La IP del host Devuelve un objeto asociado al localhost 22

Ejemplo

import java.net.*;

public class DireccionIP {

public static void main(String[] args) { try { InetAddress host=InetAddress.getByName("www.itver.edu.mx"); System.out.println("Host="+host); System.out.println("IP="+host.getHostAddress()); System.out.println("Nombre="+host.getHostName()); System.out.println( "Localhost="+InetAdress.getLocalHost()); catch(UnknownHostException ex){ System.err.println("Host desconocido"); System.exit(0); SALIDA: Host : www.itver.edu.mx/148.208.233.80 IP : 148.208.233.80 Nombre : www.itver.edu.mx Localhost: Proy-Inv/10.10.200.103

(12)

23

Recursos de la Web

Recursos de la Web

IV.2 24

Clase URL

La clase URL representa una Uniform Resource Locator, un apuntador a un recurso en la Web.

Un recurso puede ser algo tan simple como un archivo o un directorio, o puede ser una referencia a un objeto más complejo (una consulta a una base de datos, un motor de búsqueda)

(13)

25

Lectura desde un URL

()URL.openStream

InputStreamReader Maneja bytes como caracteres

BufferedReader ()readLine

Contenido de una página

Filtro Abrir flujo de bytes

26

Ejemplo

import java.io.*; import java.net.*; public class ManejoURL {

public static void main(String[] args){ try {

URL url =

new URL("http://mx.geocities.com/progiii_rrl/index.html"); InputStreamReader flujo =

new InputStreamReader(url.openStream());

BufferedReader filtro = new BufferedReader(flujo); String linea; while ((linea=filtro.readLine())!=null) { System.out.println(linea); } filtro.close(); }

catch (MalformedURLException ex){...} catch (IOException ex) {...}

} }

Asocia un objeto a un recurso Web

openStream abre un flujo de bytes.

InputStreamReader cambia bytes por caracteres. BufferedReader permite leer

(14)

27

Ejemplo

SALIDA:

<html> <head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<meta name="Generator" content="Microsoft Publisher 2000">

<title>Programación III</title> </head>

<body bgcolor="#ffffff" link="#cc6600" vlink="#808000" text="#000000" background="back.gif" topmargin=0 leftmargin=0> <a name=top></a> <table border=0 28

Cliente / Servidor

Cliente / Servidor

IV.2

(15)

29

Cliente/servidor

Un cliente necesita algún tipo de información Un servidor tiene mucha información que puede proporcionar.

Típicamente, un cliente se conecta a un servidor y solicita cierta

información.

El servidor busca la información y entonces la regresa al cliente.

30

Modelo Cliente/Servidor

64.208.34.100 www.google.com 193.6.124.88 200.17.77.12 puerto 80 Aplicación del servidor Aplicación del cliente Aplicación del cliente

(16)

31

Cliente / Servidor

• Un cliente - Inicia la conexión - Recupera datos - Despliega datos - Responde a la entradas del usuario - Solicita más datos • Ejemplos: Navegador,Chat •Un servidor: -Responde a la conexión -Recibe la solicitud por datos

-Busca los datos -Los libera •Ejemplos:

Web Server, Database Server, Domain Name Server, Mail Server …

32

Cliente / Servidor

Se puede implementar un esquema cliente servidor

con el protocolo TCP: Utilizando las clases

ServerSocket y Socket O se puede implementar con el protocolo UDP: Utilizando las clases

DatagramPacket y DatagramSocket

(17)

33

Sockets TCP

Sockets TCP

IV.2 34

Sockets

Un socket es un punto final de un enlace de dos vías entre dos programas ejecutándose en la red.

Los sockets se utilizan para comunicarse a través de puertos. Un socket es un canal de comunicación que permite trasferir datos entre un puerto.

Un socket se asocia a un puerto. Cliente: Utilizando la clase Socket. Servidor: Utilizando la clase ServerSocket

(18)

35

Usando un socket TCP

Un cliente:

2. Abre un socket

3. Abre flujos de entrada y salida para el socket 4. Lee y escribe en los flujos

de acuerdo con los protocolos del cliente 5. Cierra los flujos 6. Cierra el socket

Un servidor: 2. Abre un socket

3. Abre los flujos de entrada y salida del socket

4. Lee y escribe en los flujos de acuerdo a los procolos del servidor.

5. Cierra los flujos 6. Cierra el socket

36

Clase ServerSocket (servidor)

ServerSocket(int port)

Crea un socket en el servidor en un puerto específico. Un puerto 0 crea un socket sobre un puerto libre.

Regresa el puerto en el cual el socket está asociado.

getLocalPort()

Regresa la dirección IP local del servidor.

getInetAddress()

Cierra el socket close()

Acepta una conexión a este socket.

accept()

Descripción Método

(19)

37

Clase Socket (cliente)

Socket()

Socket(InetAddress address, int port); Socket(String host, int port);

Crea un socket en el cliente

Asocia un flujo de bytes de salida por el socket

getOutputStream()

Asocia un flujo de bytes de entrada por el socket

getInputStream()

Descripción Método

38

Ejemplo para Servidor

import java.net.*; import java.io.*;

public class ServidorTCP {

public static void main(String[] args) { int port = 0;

String cadena = "Mensaje del servidor"; ServerSocket server = null;

try {

server = new ServerSocket(port); ...

} catch (IOException ioe){...}

Crea el socket en un puerto libre y espera un cliente Servidor Puerto

Socket Un servidor puede atender varios clientes en un puerto, abriendo varios

(20)

39

Ejemplo para Servidor

try {

Socket conexion = server.accept();

InputStream flujoBE = conexion.getInputStream(); Reader flujoCE = new InputStreamReader(flujoBE); BufferedReader reader = new BufferedReader(flujoCE); ...

Acepta conexión

Abre flujos

Servidor Cliente

conexion.getInputStream() Flujo de bytes del cliente

InputStreamReader Maneja un flujo de

bytes como flujo de caracteres BufferedReader

Filtro para leer Strings

40

Ejemplo para Servidor

...

OutputStream flujoBS = conexion.getOutputStream(); Writer flujoCS = new OutputStreamWriter(flujoBS); BufferedWriter writer = new BufferedWriter(flujoCS); ...

Abre flujos

Servidor Cliente

conexion.getOutputStream() Flujo de bytes del cliente

InputStreamWriter Maneja un flujo de

caracteres como flujo de bytes BufferedWriter

Filtro para pasar Strings como caracteres

(21)

41

Ejemplo para Servidor

...

System.out.println("El cliente es "+reader.readLine()); writer.write("Conectado a"+conexion.getInetAddress()); writer.flush(); for(int i=0;i<cadena.length();i++){ writer.write(cadena.substring(0,cadena.length()-i)); writer.flush(); } reader.close(); writer.close(); conexion.close(); Lee del cliente Envía datos al cliente

Servidor Cliente

readln()

write()

42

Ejemplo para Servidor

Al correr el programa se presenta la siguiente información:

El puerto utilizado por el socket es: 3032

Los clientes deberán conectarse a este servidor usando este puerto

La dirección IP del servidor es: Proy-Inv/10.10.200.103 Esperando un cliente Es el número de puerto disponible, puede cambiar en cada corrida Esta es la dirección IP del

servidor, necesaria para que el cliente se conecte

(22)

43

Lado del cliente

Servidor Cliente

readln()

write()

El cliente, para conectarse a un servidor con TCP, debe hacerlo indicando a que Servidor y en que puerto se va a conectar.

El método Socket(Servidor, puerto) permite crear una conexión TCP del cliente hacia el servidor

44

Ejemplo para Cliente

public static void main(String[] args) { int port = Integer.parseInt(args[1]); Socket cliente = null;

try{

cliente = new Socket(args[0], port); } catch (IOException ioe) {...}

Los parámetros del cliente indican el nombre del servidor y el puerto al cual

conectarse Se crea una conexión con el

servidor dado en args[0] en el puerto indicado por args[1]

Se debe ejecutar el programa desde la línea de comandos: C:\>java ClienteTCP servidor puerto

(23)

45

Ejemplo para Cliente

InputStream flujoBE = cliente.getInputStream(); Reader flujoCE = new InputStreamReader(flujoBE); BufferedReader reader = new BufferedReader(flujoCE); OutputStream flujoBS = cliente.getOutputStream(); Writer flujoCS = new

OutputStreamWriter(cliente.getOutputStream()); BufferedWriter writer = new BufferedWriter(flujoCS); writer.write(InetAddress.getLocalHost()+"\n"); writer.flush(); String entrada; do{ entrada = reader.readLine(); System.out.println("Recibido: "+entrada); } while(entrada.length()>1);

De igual forma que el servidor, abre un flujo de escritura y uno de lectura.

46

Ejemplo para Cliente

Servidor Cliente

readln()

write() readln()

write()

Como es un esquema orientado a conexión, el enlace permanece hasta que se cierra por alguno de los participantes

(24)

47

Sockets UDP

Sockets UDP

IV.2 48

Clase DatagramSocket

Los sockets TCP necesitan que se indique establezca una conexión.

Para hacer una trasmisión sin conexiones (UDP) se utiliza la

clase DatagramSocket.

No se asocia un flujo al puerto.

Cada paquete debe indicar información del

host origen y del host destino

(25)

49

Usando un DatagramSocket

Se requieren dos puertos para una comunicación UDP, uno de envio y otro de recepción (El socket de recepción es 5000 y 5001, para este ejemplo).

Servidor 5000 Cliente

5001

Para socket de recepción DatagramSocket(puerto)

Para socket de envío DatagramSocket() Descripción Constructor 50

Usando un DatagramSocket

Para enviar y recibir paquetes se utilizan los siguientes métodos. Un paquete es un objeto de la clase DatagramPacket

Servidor 5000 Cliente 5001 Para recepción receive(DatagramPacket) Para envío send(DatagramPacket) Descripción Método send() receive() send()

(26)

51

Usando DatagramPacket

Para construir el paquete a enviar se crea un objeto con este constructor:

Información enviada en un arreglo de bytes Longitud del arreglo de bytes Dirección IP del destino Puerto al que se envía

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

Para construir el paquete que recibe se crea un objeto con este constructor:

DatagramPacket(byte[] buf, int length)

52

Servidor UDP

class ServerUDP extends Frame{ ...

public ServerUDP(){ ...

try{

socketEnvia = new DatagramSocket(); socketRecibe = new DatagramSocket(5000); } catch (SocketException se){... } ...

}

(27)

53

Servidor UDP

...

captura.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ try {

byte array[] = new byte[100];

pantalla.append("Servidor: "+captura.getText()+"\n"); array = captura.getText().getBytes(); paqEnviado = new DatagramPacket(array,array.length,host,5001); socketEnvia.send(paqEnviado); captura.setText("");

}catch (Exception ex) {... } }

}); }

El objeto captura es un TextField donde se captura la información a enviar

Se construye el paqueta a enviar Se envía el paquete 54

Servidor UDP

public void ChecaPaquetes() { while (true){

try {

byte array[] = new byte[100];

paqRecibido = new DatagramPacket(array,array.length); socketRecibe.receive(paqRecibido);

String recibido = new String(paqRecibido.getData()); host = paqRecibido.getAddress();

pantalla.append(host.getCanonicalHostName()+": "+recibido); pantalla.append("\n");

}

catch (Exception ex){...} }

}

El método checa paquetes está escuchando al puerto de entrada si se reciben paquetes

El servidor identifica al cliente que inicio la conversación y a ese cliente es al que le contesta

(28)

55

Cliente UDP

El servidor y el cliente UDP tienen el casi el mismo código, solo que el cliente debe indicar a que servidor se conecta

public ClienteUDP(String servidor){ try {

socketEnvia = new DatagramSocket(); socketRecibe = new DatagramSocket(5001);

host = InetAddress.getByName(servidor); }

... }

captura.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ try{

paqEnviado = new

DatagramPacket(array,array.length,host,5000); socketEnvia.send(paqEnviado);

Figure

Actualización...

Referencias

Actualización...