1
Programación
Programación
Orientada a Objetos
Orientada a Objetos
con Java
con Java
Rafael Rivera LópezDepartamento de Sistemas y Computación Invierno 2005 Veracruz, Ver.
Programa de Formación y
Actualización Docente
2Temas Avanzados
IV3
TCP/IP e Internet
TCP/IP e Internet
IV.2 4URLs
Protocolo Archivo Host/Computadora Cada pieza de información en laWeb tiene una dirección de identificación única llamada URL
(Uniform Resource Locator).
Ejemplo:
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
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 8Protocolo
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 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
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.
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)
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.217
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 Internet19
Direcciones IP
Direcciones IP
IV.2 20Clase 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
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
23
Recursos de la Web
Recursos de la Web
IV.2 24Clase 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 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
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.229
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 cliente31
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
33
Sockets TCP
Sockets TCP
IV.2 34Sockets
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
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
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
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
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
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 UDP
Sockets UDP
IV.2 48Clase 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 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()
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){... } ...
}
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
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);