Programación Orientada a Objetos con Java Temas Avanzados

Transcripción

Programación Orientada a Objetos con Java Temas Avanzados
Programa de Formación y
Actualización Docente
Programación
Orientada a Objetos
con Java
Rafael Rivera López
Departamento de Sistemas y
Computación
Invierno 2005
1
Veracruz, Ver.
IV
Temas Avanzados
2
IV.2
TCP/IP e Internet
3
URLs
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
Archivo
Host/Computadora
Protocolo
4
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.
5
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.
6
Interacción Navegador-HTTPD
usuario solicita
http:// java.sun.com /index.html
Solicita /index.html
host java.sun.com
Envía el contenido
de index.html
Aplicación
de HTTPD
Navegador
Disco
7
Protocolo
Un protocolo es un conjunto de reglas que definen el tipo de
comunicación:
9 344101
“Si conoce la extensión, capturela”
5
“Conectando a la extensión solicitada”
8
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
TCP/IP es el conjunto de protocolos
para comunicación por internet:
Capa
Protocolo
Aplicación
Transporte
Red
Enlace
HTTP, FTP, Telnet, ...
TCP, UDP
IP
Ethernet, TokenRing, ...
9
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
135.17.98.250
127.0.0.1
localhost
10
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
11
Capa de transporte
TCP (Protocolo de control de transmisión)
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.
UDP (Protocolo de datagrama de usuario)
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
12
¿TCP ó UDP?
Se utiliza TCP para:
HTTP (páginas Web)
FTP (Transferencia de archivos remotos)
Telnet (Terminal remota)
Se utiliza UDP para:
Transmisión de Audio
Transmisión de video
13
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)
14
Puertos
Cada destino en Internet es identificado por un host
(dirección IP de 32 bits) y un puerto (16 bits).
Protocolo
Puerto
HTTP (Transferencia de Hipertexto)
Correo
Telnet (conexión remota)
FTP (Transferencia de archivos)
80
25
23
21
¿por qué no se especifica un
puerto al usar un navegador?
15
IV.2
Trabajando con redes
16
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
17
Paquete java.net
Object
ServerSocket
DatagramPacket
Socket
DatagramSocket
Para cliente/servidor
sin conexión
Para cliente/servidor
orientado a conexión
InetAddress
Para información de
una dirección IP
URL
Para localizar
recursos en Internet
18
IV.2
Direcciones IP
19
Clase InetAddress
La clase InetAddress representa las direcciones del
protocolo IP
Método
Descripción
getHostName()
Devuelve el nombre del objeto
getHostAddress()
Devuelve la IP del objeto
getByName(String)
Devuelve un objeto InetAddress
de un host
getLocalHost()
Devuelve un objeto InetAddress
de la máquina local
20
Devuelve un objeto
Ejemplo asociado
al nombre del
host
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());
El nombre del
catch(UnknownHostException ex){
host
System.err.println("Host desconocido");
La IP del host
System.exit(0);
Devuelve un objeto
asociado al localhost
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){
SALIDA:desconocido");
System.err.println("Host
Host
: www.itver.edu.mx/148.208.233.80
System.exit(0);
IP
: 148.208.233.80
Nombre
: www.itver.edu.mx
Localhost: Proy-Inv/10.10.200.103
22
IV.2
Recursos de la Web
23
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)
24
Lectura desde un URL
Abrir flujo de bytes
()URL.openStream
Filtro
BufferedReader
InputStreamReader
Maneja bytes como caracteres
()readLine
Contenido de
una página
25
Ejemplo
import java.io.*;
import java.net.*;
Asocia un objeto a
public class ManejoURL {
un recurso Web
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);
openStream abre un flujo de
}
bytes.
filtro.close();
}
InputStreamReader cambia
catch (MalformedURLException ex){...}
bytes por caracteres.
catch (IOException ex) {...}
BufferedReader permite leer
}
Strings
}
26
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
27
IV.2
Cliente / Servidor
28
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.
29
Modelo Cliente/Servidor
puerto 80
Aplicación
del cliente
200.17.77.12
Aplicación del
servidor
64.208.34.100
www.google.com
Aplicación
del cliente
193.6.124.88
30
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 …
31
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
32
IV.2
Sockets TCP
33
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
34
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
35
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.
Método
Descripción
accept()
Acepta una conexión a este
socket.
close()
Cierra el socket
getLocalPort()
Regresa el puerto en el cual el
socket está asociado.
getInetAddress() Regresa la dirección IP local del
servidor.
36
Clase Socket (cliente)
Socket()
Socket(InetAddress address, int port);
Socket(String host, int port);
Crea un socket en el cliente
Método
Descripción
getInputStream()
Asocia un flujo de bytes de
entrada por el socket
getOutputStream()
Asocia un flujo de bytes de
salida por el socket
37
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){...}
Socket
Servidor
Puerto
Crea el
socket en un
puerto libre y
espera un
cliente
Un servidor puede atender
varios clientes en un
puerto, abriendo varios
sockets
38
Ejemplo para Servidor
Acepta conexión
try {
Socket conexion = server.accept();
InputStream flujoBE = conexion.getInputStream();
Reader flujoCE = new InputStreamReader(flujoBE);
BufferedReader reader = new BufferedReader(flujoCE);
...
Abre flujos
BufferedReader
Filtro para leer Strings
conexion.getInputStream()
Flujo de bytes del cliente
Servidor
Cliente
InputStreamReader
Maneja un flujo de
bytes como flujo
de caracteres
39
Ejemplo para Servidor
...
OutputStream flujoBS = conexion.getOutputStream();
Writer flujoCS = new OutputStreamWriter(flujoBS);
BufferedWriter writer = new BufferedWriter(flujoCS);
...
BufferedWriter
Filtro para pasar
Strings como caracteres
Abre flujos
conexion.getOutputStream()
Flujo de bytes del cliente
Servidor
Cliente
InputStreamWriter
Maneja un flujo de
caracteres como
flujo de bytes
40
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();
Lee del
writer.close();
cliente
conexion.close();
Envía datos al cliente
readln()
Servidor
Cliente
write()
41
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
Esta es la dirección IP del
servidor, necesaria para que el
cliente se conecte
Es el número de
puerto disponible,
puede cambiar en
cada corrida
42
Lado del cliente
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
readln()
Servidor
Cliente
write()
43
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) {...}
Se crea una conexión con el
servidor dado en args[0] en el
puerto indicado por args[1]
Los parámetros del cliente
indican el nombre del
servidor y el puerto al cual
conectarse
Se debe ejecutar el programa desde la línea de comandos:
C:\>java ClienteTCP servidor puerto
44
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.
45
Ejemplo para Cliente
readln()
write()
Servidor
Cliente
write()
readln()
Como es un esquema orientado a conexión, el enlace
permanece hasta que se cierra por alguno de los
participantes
46
IV.2
Sockets UDP
47
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
48
Usando un DatagramSocket
5001
Servidor
Cliente
5000
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).
Constructor
Descripción
DatagramSocket()
Para socket de envío
DatagramSocket(puerto) Para socket de recepción
49
Usando un DatagramSocket
send()
5001
Servidor
Cliente
5000
receive()
send()
Para enviar y recibir paquetes se utilizan los siguientes métodos.
Un paquete es un objeto de la clase DatagramPacket
Método
Descripción
send(DatagramPacket)
Para envío
receive(DatagramPacket)
Para recepción
50
Usando DatagramPacket
Para construir el paquete a enviar se crea un objeto con este constructor:
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
Información
enviada en
un arreglo
de bytes
Longitud
del
arreglo
de bytes
Dirección IP
del destino
Puerto
al que
se
envía
Para construir el paquete que recibe se crea un objeto con este
constructor:
DatagramPacket(byte[] buf, int length)
51
Servidor UDP
class 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
52
Servidor UDP
El objeto captura es un TextField donde se
captura la información a enviar
...
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("");
Se construye el
}catch (Exception ex) {... }
paqueta a enviar
}
});
}
Se envía el
paquete
53
Servidor UDP
El método checa paquetes está escuchando al puerto
de entrada si se reciben paquetes
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 servidor identifica al cliente que inicio la conversación
y a ese cliente es al que le contesta
54
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);
...
55

Documentos relacionados