Conectividad en Java
IV
TCP/IP e InternetTCP/IP e Internet
IV.2
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
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.
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
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:
Comunicación entre computadoras
Es un proceso muy complicado
Demasiados detalles:� Hardware
� señales
� voltajes
� cables
� etc.
� Software:� Programas
� Protocolos
� Aplicaciones
� etc.
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:
Modelo de Capas
Ejemplo: envío de una carta1. El jefe pide a su secretaria que transcriba y
envíe una carta de felicitación de aniversario a su esposa. Asume que la esposa recibirá la carta (Aplicación)
2. La secretaria la transcribe y la pone en un sobre. Debe estar pendiente de que la esposa la reciba. La entrega al mensajero. (Transporte)
3. El mensajero la deposita en el buzón de salida. No se preocupa de verificar que la esposa haya recibido la carta. (Red)
4. El servicio postal se encarga de transportar la carta y ponerla en el buzón de la esposa. No se preocupa si la esposa la recibió o nó. (Enlace)
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.1
localhost
135.17.98.250
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
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)
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
Trabajando con redesTrabajando con redes
IV.2
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
Paquete java.netObjectObject
ServerSocketServerSocket
SocketSocket
InetAddressInetAddress
DatagramPacketDatagramPacket
DatagramSocketDatagramSocket
URLURL
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
Direcciones IPDirecciones IP
IV.2
Clase InetAddress
Devuelve el nombre de la máquina (host)
getHostName()
Devuelve la dirección IP del host
getHostAddress()
Devuelve un objeto InetAddress asociado al nombre del 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
Ejemploimport 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="+InetAddress.getLocalHost());}catch(UnknownHostException ex){System.err.println("Host desconocido");System.exit(0);}}}
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="+InetAddress.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
Ejemploimport 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);}}}
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.80IP : 148.208.233.80Nombre : www.itver.edu.mxLocalhost: Proy-Inv/10.10.200.103
Recursos de la WebRecursos de la Web
IV.2
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)
Lectura desde un URL
URL.openStream()
InputStreamReader
Maneja bytes como caracteres
BufferedReader
readLine()
Contenido de
una página
Filtro
Abrir flujo de bytes
Ejemploimport java.io.*;import java.net.*;public class ManejoURL {public static void main(String[] args){try {URL url = new URL("http://mx.geocities.com/hector_andrade");
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) {...}}}
import java.io.*;import java.net.*;public class ManejoURL {public static void main(String[] args){try {URL url = new URL("http://mx.geocities.com/hector_andrade");
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
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
Cliente / ServidorCliente / Servidor
IV.2
Cliente/servidor
Un cliente necesita algún tipo de información
Un servidor tiene 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.
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
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 …
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
Sockets TCPSockets TCP
IV.2
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
Usando un socket TCPUn cliente:
1. Abre un socket
2. Abre flujos de entrada y
salida para el socket
3. Lee y escribe en los flujos
de acuerdo con los
protocolos del cliente
4. Cierra los flujos
5. Cierra el socket
Un servidor:
1. Abre un socket
2. Acepta (espera) una
conexión
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
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
Clase Socket (cliente)Socket()
Socket(InetAddress address, int port);
Socket(String host, int port);
Crea un socket en el cliente
Consigue el flujo de bytes de salida del socket
getOutputStream()
Consigue el flujo de bytes de entrada del socket
getInputStream()
DescripciónMétodo
Ejemplo para Servidor
import java.net.*;import java.io.*;public class ServidorTCP {public static void main(String[] args) {int port = 2882;String cadena = "Mensaje del servidor";ServerSocket server = null;try {server = new ServerSocket(port);...
} catch (IOException ioe){...}
import java.net.*;import java.io.*;public class ServidorTCP {public static void main(String[] args) {int port = 2882;String cadena = "Mensaje del servidor";ServerSocket server = null;try {server = new ServerSocket(port);...
} catch (IOException ioe){...}
Crea el
socket en el
puerto (port)
Servidor
Puerto
Socket Un servidor puede atender
varios clientes en un
puerto, abriendo varios
sockets
Ejemplo para Servidor
try {Socket conexion = server.accept();InputStream flujoBE = conexion.getInputStream();Reader flujoCE = new InputStreamReader(flujoBE);BufferedReader reader = new BufferedReader(flujoCE);...
Espera a un cliente y
acepta la 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
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
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
clienteEnvía datos al cliente
Servidor Cliente
readln()
write()
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 clienteEs 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
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
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
Ejemplo para Cliente
InputStream flujoBE = cliente.getInputStream();Reader flujoCE = new InputStreamReader(flujoBE);BufferedReader reader = new BufferedReader(flujoCE);OutputStream flujoBS = cliente.getOutputStream();Writer flujoCS = newOutputStreamWriter(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.
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
Sockets UDPSockets UDP
IV.2
Clase DatagramSocket
Los sockets TCP
necesitan que se
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
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
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()
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)
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
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
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
Cliente UDPEl servidor y el cliente UDP tienen el casi el mismo código,
solo que el cliente debe indicar servidor al que se quiere
conectarpublic 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 = newDatagramPacket(array,array.length,host,5000);
socketEnvia.send(paqEnviado);...