Upload
vuongdat
View
218
Download
0
Embed Size (px)
Citation preview
1
Programación Programación Orientada a Objetos Orientada a Objetos
con Javacon 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
3
TCP/IP e InternetTCP/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:
http://mx.geocities.com/progiii_rrl/page7.htm
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
información.
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:
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
IPRed
TCP, UDPTransporte
HTTP, FTP, Telnet, ...Aplicación
Capa Protocolo
TCP/IP es el conjunto de protocolos para comunicación por internet:
10
Capa de RedTodo 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.1localhost
135.17.98.250
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.
TCP (Protocolo de control de transmisión)
13
¿TCP ó UDP?
Transmisión de AudioTransmisió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)
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?
80252321
HTTP (Transferencia de Hipertexto)CorreoTelnet (conexión remota)FTP (Transferencia de archivos)
PuertoProtocolo
16
Trabajando con redesTrabajando con redes
IV.2
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.netObject
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
19
Direcciones IPDirecciones IP
IV.2
20
Clase InetAddress
Devuelve el nombre del objeto getHostName()
Devuelve la IP del objetogetHostAddress()
Devuelve un objeto InetAddress de un host
getByName(String)
Devuelve un objeto InetAddress de la máquina local
getLocalHost()
DescripciónMétodo
La clase InetAddress representa las direcciones del protocolo IP
21
Ejemploimport java.net.*;public class DireccionIP {
public static void main(String[] args) {try {
InetAddress host=InetAddress.getByName("www.itver.e du.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
Ejemploimport java.net.*;public class DireccionIP {
public static void main(String[] args) {try {
InetAddress host=InetAddress.getByName("www.itver.e du.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.80IP : 148.208.233.80Nombre : www.itver.edu.mxLocalhost: Proy-Inv/10.10.200.103
23
Recursos de la WebRecursos 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)
25
Lectura desde un URL
()URL.openStream
InputStreamReader
Maneja bytes como caracteres
BufferedReader
()readLine
Contenido deuna página
Filtro
Abrir flujo de bytes
26
Ejemploimport 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/i ndex.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
Strings
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="#8080 00" text="#000000" background="back.gif" topmargin=0 leftmargin=0><a name=top></a>
<table border=0
28
Cliente / ServidorCliente / Servidor
IV.2
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
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 SocketO se puede implementar
con el protocolo UDP:Utilizando las clases
DatagramPacket y DatagramSocket
33
Sockets TCPSockets TCP
IV.2
34
SocketsUn 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
35
Usando un socket TCPUn 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 socketclose()
Acepta una conexión a este socket.
accept()
DescripciónMétodo
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ónMé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 sockets
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
InputStreamReaderManeja un flujo de
bytes como flujo de caracteres
BufferedReaderFiltro 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
InputStreamWriterManeja un flujo de
caracteres como flujo de bytes
BufferedWriterFiltro para pasar
Strings como caracteres
41
Ejemplo para Servidor... System.out.println("El cliente es "+reader.readLin e()); 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: 3032Los clientes deberán conectarse a este servidor usando este puertoLa dirección IP del servidor es:Proy-Inv/10.10.200.103Esperando 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
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
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
47
Sockets UDPSockets 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
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 Cliente5000
5001
Para socket de recepciónDatagramSocket(puerto)
Para socket de envíoDatagramSocket()
DescripciónConstructor
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 Cliente5000
5001
Para recepciónreceive(DatagramPacket)
Para envíosend(DatagramPacket)
DescripciónMétodo
send()
receive() send()
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 UDPclass ServerUDP extends Frame{ ... public ServerUDP(){ ... try{ socketEnvia = new DatagramSocket(); socketRecibe = new DatagramSocket(5000); } catch (SocketException se){... } ... }
Crea los sockets de envío y recepción
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.le ngth); socketRecibe.receive(paqRecibido); String recibido = new String(paqRecibido.getDat a()); 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
55
Cliente UDPEl 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);...