Title: Tema 16: Comunicaciones en Red
1Tema 16 Comunicaciones en Red
2Índice
- Introducción.
- Socket.
- URL.
- Datagramas.
3Introducción
- Se puede realizar con cualquier lenguaje
- java.net
- Las clases encapsulan el paradigma de socket
(conectores) creados por BSD (Berkeley Software
Distribution) en la Universidad de Berkeley. - UNIX 4.2BSD (Bill Joy, en Sun Microsystems).
- Los programas Java están en la capa de
aplicación. - Pasos Abrir, leer/escribir, cerrar.
4TCP (Transport Control Protocol)
- Comunicaciones fiables, establecen una conexión y
comunicaciones en ambos sentidos. - El orden en que se envían y reciben los datos es
crítico. - Servicio telefónico.
- Ejemplos
- HTTP (Hypertext Transfer Protocol)
- FTP (File Transfer Protocol)
- Telnet
- Clases URL, URLConnection, Socket y ServerSocket.
5UDP (User Datagram Protocol)
- No está orientado a conexión. No se garantiza la
entrega. - Servicio postal.
- Los paquetes de datos datagramas.
- Clases DatagramPacket, DatagramSocket y
MulticastSocket.
6Puertos
- Distingue la aplicación dentro de la máquina.
- Los datos van acompañados de
- la dirección de la computadora (32 bits)
- el puerto al que va destinado (16 bits)
- Rango para los puertos 0-65535
7Servidor
Puerto
Cliente
8Aplic.
Aplic.
Aplic.
Aplic.
puerto
puerto
puerto
puerto
TCP o UDP
Datos
Datos
puerto
9Conectores reservados
- TCP/IP reserva los primeros 1024 para sus
protocolos específicos.
Puerto
Servicio
13/udp
daytime
21/tcp
ftp
23 /tcp
telnet
25 /tcp
E-mail
79 /tcp
finger
80 /tcp
HTTP
119 /tcp
netnews
10Servicio de nombres de Dominio (DNS)
- Existe una jerarquía de nombres asociada a los
números que representan las direcciones que se
conoce como DNS. - Permite teclear www.yahoo.com en vez de
205.216.146.71.
11Aplicación (HTTP, ftp, telnet, ...)
Transporte (TCP, UDP, ...)
Red (IP, ...)
Enlace (dispositivo driver, ...)
12El paquete java.net (I)
SocketImpl
Clase abstracta.
Socket
Implementa un cliente Socket.
ServerSocket
Implementa un servidor Socket.
SocketPermission
Acceso a la red vía socket
13El paquete java.net (II)
URL
Puntero a un recurso en la world wide web
URLConnection
Clase abstracta. Superclase para comunic. entre
aplic y URL.
URLClassLoader
Carga clases y recursos
URLDecoder
Convierte el formato MIME en String
URLEncoder
Convierte el formato String en MIME
URLStreamHandler
Clase abstracta.
HttpURLConnection
Un URLConnection con soporte para características
http.
JarURLConnection
Uso de archivos JAR
ContentHandler
Clase abstracta.
14El paquete java.net (III)
DatagramPacket
Clase que representa un datagrama.
DatagramSocket
Tx/Rx de datagramas en un socket.
MulticastSocket
Tx/Rx de paquetes IP multicast.
15El paquete java.net (y IV)
InetAddress
Respresenta una dirección de IP.
Authenticator
Autentificación para una conexión a la red.
NetPermission
Clase para permisos en la red.
PasswordAuthentication
Para autentificación
16InetAddress
- Encapsula direcciones IP y sus nombres.
- No tiene constructores visibles, pero se
proporcionan métodos estáticos. - static InetAddress getLocalHost()
- Devuelve el objeto que representa al nodo local.
- static InetAddress getByName(String nomNodo)
- Devuelve el nombre del nodo que se le pasa.
- Puede lanzar UnknownHostException (excepción de
nodo desconocido). - static InetAddress getAllByName(String nomNod)
- devuelve una matriz que representa todas las
direcciones en las que se traduce un nombre dado. - Puede lanzar UnknownHostException.
17 import java.net.InetAddress class dire
public static void main(String args)
InetAddress direccion try direccion
InetAddress.getLocalHost() System.out.println(d
ireccion) System.out.println() direccion
InetAddress.getByName("trajano.us.es") System.o
ut.println(direccion) System.out.println() I
netAddress SW InetAddress.getAllByName("trajan
o.us.es") for(int i 0 iltSW.length
i) System.out.println(SWi) catch
(Exception e) System.out.println("Error en
ejecución "e) / 16-adrianoMongt
java dire adriano/193.147.162.138 trajano.us.es/1
93.147.162.130 trajano.us.es/193.147.162.130
17-adrianoMongt
/
18Métodos no estáticos
- String getHostName()
- Devuelve como cadena el nombre del nodo.
- byte getAddress()
- Devuelve una matriz de bytes de cuatro elementos
que representa la dirección en Internet del
objeto en el "orden de bytes de la red". - String toString()
- Devuelve el nombre del nodo y la dirección IP.
Ejemplo, "starwave.com/192.147.170.6". - boolean equals(InetAddress otroNodo)
- Devuelve true si los objeto tiene la misma
dirección.
19Socket
- Socket Comunic. de bajo nivel.
- URL y URLConnection Comunic. de alto nivel.
- Sobre TCP, cada programa establece una conexión
(cliente-servidor) y va ligado a un socket. - Los socket son puntos finales del enlace.
- Los procesos los trata como descriptores de
ficheros. - El Cliente conoce
- el nombre la máquina servidora
- número de puerto al que está conectado
- El Servidor
- Acepta la conexión
20Modelo de Comunicaciones
Servidor
Cliente
ServerSocket(port) accept()
Socket(host,port)
OutputStream InputStream
OutputStream InputStream
close()
close()
21Constructores para el cliente
- Cuando se crea un objeto Socket, se establece una
conexión entre cliente y servidor. - Socket(String nodo, int puerto)
- Crea un conector que conecta el nodo local con el
nodo y puerto especificados. - Socket(InetAddress dirección, int puerto)
- Crea un conector utilizando un objeto InetAddress
ya existente y un puerto. - En total son 8 constructores (versión 1.2).
- Puede lanzar UnknownHostException o IOException.
22Información del Socket y flujos
- InetAddress getInetAddress()
- Devuelve la InetAddress asociada con el objeto
Socket. - int getPort()
- Devuelve el puerto remoto al que está conectado
este objeto Socket. - int getLocalPort()
- Devuelve el puerto local al que está conectado
este objeto Socket. - InputStream getInputStream()
- Devuelve el InputStream (flujo de entrada)
asociado con este conector. - OutputStream getOutputStream()
- Devuelve el OutputStream (flujo de salida)
asociado con este conector. - void close()
- Cierra el InputStream y el OutputStream.
23Constructores para el Servidor
- ServerSocket(int puerto)
- Crea un conector en el servidor en un puerto
específico. - ServerSocket(int puerto, int backlog)
- Se configura la longitud máx. de la cola de
entrada. - ServerSocket(int port, int backlog, InetAddress
dir) - Ligada a una dirección.
24Creación de flujos de Entrada
- En el cliente se crea un flujo de entrada para
recibir las respuestas del servidor
(DataInputStream) - Socket sock new Socket(host,puerto)
- DataInputStream in new DataInputStream(sock.getI
nputStream()) - DataInputStream tiene métodos como read(),
readLine(), readChar(), readInt(), - En el servidor también, para recibir a los
clientes - ServerSocket sock new ServerSocket(puerto)
25Creación de flujos de Salida
- En el cliente se crea un flujo de salida para
enviar información al servidor (DataOutputStream
o PrintStream) - PrintStream out new PrintStream(sock.getOutputSt
ream()) - DataOutputStream out new DataInputStream(sock.ge
tOutputStream()) - PrintStream tiene los métodos write y println.
- DataOutputStream escribe los datos primarios y
writeBytes. - En el servidor se envía información al cliente
- PrintStream out new PrintStream(sock.getOutputSt
ream())
26import java.net. import java.io. class
Whois public static void main(String args)
throws Exception int c Socket s new
Socket("intermic.net",43) InputStream in
s.getInputStream() OutputStream out
s.getOutputStream() String str
(args.length0 ? starwave.com
args0"\n) byte buf new
bytestr.length() str.getBytes(0,str.length(),
buf, 0 ) out.write(buf) while((c
in.read()) ! -1) System.out.println((char)c)
s.close() in.close() out.close()
27import java.io. import java.net. public
class EchoClient public static void
main(String args) throws IOException
Socket echoSocket null PrintWriter out
null BufferedReader in null
try echoSocket new
Socket("adriano", 7)//crea un socket // dos
siguientes lineas son para leer/escribir en
socket out new PrintWriter(echoSocke
t.getOutputStream(), true) in new
BufferedReader(new InputStreamReader(echoSocket
.getInputStream())) catch
(UnknownHostException e)
System.err.println("No conoce el host
adriano.") catch (IOException e)
System.err.println("Error E/S en la
conexion adriano.")
Continúa ...
28Continuación
if(echoSocket!null in!null
out!null) BufferedReader stdIn new
BufferedReader(new InputStreamReader(System.in
)) String userInput while ((userInput
stdIn.readLine()) ! null)
out.println(userInput) System.out.println("e
cho " in.readLine()) out.close() in.clo
se() stdIn.close() echoSocket.close()
29URL (Uniform Resource Locator)
- Referencia (dirección) de un recurso de Internet.
- Protocolos HTTP, FTP, Gopher, File y News.
- Nombre del recurso
http//java.sun.com
Nombre del recurso
Identificador de protocolo
Nombre host
Nombre de la máquina en la que está el recurso.
Nombre fichero
Nombre del camino al fichero en la máquina.
Número de Puerto
Puerto al que se conecta (opcional).
Referencia
Referencia al nombre (opcional).
30Constructores (I)
- URL absoluto, contiene toda la información para
alcanzar el recurso - URL(String cad), ejemplo
- URL gamelan new URL("http//www.gamelan.com/")
- URL relativo, los ficheros HTML dan de forma
relacionada con el fichero en el que están. - URL(URL base ,String relativo), ejemplo
- URL game new URL("http//www.gamelan.com/pages/"
) - URL gamelan new URL(game,Gamelan.html")
31Constructores (y II)
- URL(String proto, String host, int port, String
file) - URL(String proto, String host, String file)
- URL gam new URL ("http", www.gamelan.com,
80, "/pages/Gamelan. html") - Crea un objeto URL para el siguiente URL
- http//www.gamelan.com80/pages/Gamelan.network.ht
ml - MalformedURLException
- Si el protocolo es desconocido o los argumentos
del constructor son incorrectos. - Los objetos URL se escriben una vez (no se pueden
cambiar).
32Métodos
- String getProtocol()
- Devuelve el componente identificador de protocolo
del URL - String getHost()
- Devuelve el nombre de host del URL
- int getPort()
- Devuelve el número de puerto del componente URL.
Devuelve un entero que es el número de puerto. Si
el puerto no es asignado explicitamente devuelve
-1. - String getFile()
- Devuelve el nombre del fichero del componente del
URL. - String toExternalForm()
- Devuelve una cadena que representa un URL.
33Ejemplo
import java.net. class Patric public
static void main(String args) throws
MalformedURLException URL hp new URL
("http//www.starwave.com/people/naughton/") Sys
tem.out.println("Protocolo " hp.getProtocol())
System.out.println("Puerto "
hp.getPort()) System.out.println("Nodo "
hp.getHost()) System.out.println("Archivo "
hp.getFile()) System.out.println("Ext "
hp.toExternalForm()) / Protocolo
http Puerto -1 Nodo www.starwave.com Archivo
/people/naughton/ Ext http//www.starwave.com/peo
ple/naughton/ /
34Conexión a un URL
- URLConnection openConnection()
import java.net. import java.io. class
URL0 public static void main(String args)
try URL yahoo new URL ("http//www.yahoo.c
om/") yahoo.openConnection() System.out.prin
tln("OK ") catch(MalformedURLException
e) System.out.println("Excep "
e) catch(IOException e) System.out.println("
Excep " e)
35Leyendo de un URL
import java.net. import java.io. class
URL1 public static void main(String args)
throws Exception URL yahoo new URL
("http//www.yahoo.com/") BufferedReader in
new BufferedReader( new InputStreamReader(yahoo.
openStream())) String inputLine while((input
Line in.readLine())! null) System.out.println
(inputLine) in.close()
36Leyendo de un URLConnection
- InputStream getInputStream()
import java.net. import java.io. class
URL2 public static void main(String args)
throws Exception URL yahoo new URL
("http//www.yahoo.com/") URLConnection yc
yahoo.openConnection() BufferedReader in new
BufferedReader( new InputStreamReader(yc.getInp
utStream())) String inputLine while((input
Line in.readLine())! null) System.out.printl
n(inputLine) in.close()
37Datagramas
- Los Datagramas se implementan sobre el protocolo
UDP, con dos clases - DatagramPacket, contiene los datos
- DatagramSocket, es el mecanismo para enviar o
recibir los DatagramPacket.
38Métodos
- InetAddress getAddress()
- Devuelve la dir. de destino (para envíos)
- int getPort()
- Devuelve el número de puerto.
- byte getData()
- Devuelve el contenido del datagrama
- int getLength()
- Devuelve la longitud de los datos válidos