Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Seminario Java
Seminario Java
UNIVERSIDADE DA CORUA
Java: Distribuido
UNIVERSIDADE DA CORUA
Java se ha construido con extensas capacidades de interconexin TCP/IP. Existen libreras de rutinas para acceder e interactuar con protocolos como http y ftp. Esto permite a los programadores acceder a la informacin a travs de la red con tanta facilidad como a los ficheros locales. Java en s no es distribuido, sino que proporciona las libreras y herramientas para que los programas puedan ser distribuidos, es decir, que se corran en varias mquinas, interactuando.
Octubre 2007
Java: Distribuido
Pensado para su aplicacin en redes. Soporta varios niveles de conectividad en red:
- Permite abrir un URL - RMI - Permite trabajar con sockets
UNIVERSIDADE DA CORUA
Octubre 2007
Clientes y servidores
Aplicaciones Cliente/Servidor Cliente:
Programa que ejecuta el usuario Solicita un servicio a una mquina
UNIVERSIDADE DA CORUA
Servidor:
Ofrece un servicio a mltiples clientes
Octubre 2007
UNIVERSIDADE DA CORUA
Ejecuta un telnet
Octubre 2007
UNIVERSIDADE DA CORUA
Capa de Aplicacin (HTTP, ftp, telnet) Capa de Transporte (TCP, UDP) Capa de Red (IP) Capa de Enlace (Ethernet, ...)
Octubre 2007
UNIVERSIDADE DA CORUA
Protocolos del nivel de aplicacin que usan TCP: telnet, http, ftp.
Qu es un puerto?
UNIVERSIDADE DA CORUA
Un ordenador tiene una o varias conexiones fsicas a la red. A travs de esas conexiones recibe los datos dirigidos a la mquina. Cmo determinar a que aplicacin enviar los datos? Puertos.
TCP y UDP utilizan los puertos para dirigir los datos a la aplicacin correcta de entre todas las que se estn ejecutando en la mquina.
Los datos transmitidos a travs de Internet contienen informacin de direccionamiento que identifica a la mquina y puerto a los que van dirigidos.
La mquina se identifica a travs de una direccin IP de 32 bits. Los puertos se identifican por un nmero de 16 bits.
Puertos:
Independientes para TCP y UDP. 16 bits Rango: 0 a 65535. Reservados: 0 a 1023 (well known ports)
Para servicios conocidos: HTTP,FTP, No deberan ser utilizados por aplicaciones de usuario.
Octubre 2007
TCP
UNIVERSIDADE DA CORUA
Servidor
p u e r t o
TCP
Cliente
Octubre 2007
UDP
UNIVERSIDADE DA CORUA
El cliente enva datagramas que contienen el nmero de puerto del destino asociado a la aplicacin servidora.
UDP enruta hacia la aplicacin adecuada. En cada paquete UDP va toda la informacin necesaria para que enrute: IP+puerto
Aplicacin Puerto Aplicacin Puerto UDP # Puerto
Octubre 2007
Aplicacin Puerto
Datos
Paquete
10
UNIVERSIDADE DA CORUA
Clases Java para crear programas que utilicen TCP o UDP para comunicarse sobre Internet. Clases URL, URLConnection, Socket, ServerSocket
Utilizan TCP para comunicaciones de red.
Octubre 2007
11
Qu es un socket?
UNIVERSIDADE DA CORUA
Es un extremo de un enlace de comunicacin bidireccional entre dos programas que se comunican por la red.
Un socket se asocia a un nmero de puerto.
Octubre 2007
12
UNIVERSIDADE DA CORUA
El servidor espera, escuchando por ese socket, a que los clientes hagan peticiones de conexin.
El cliente conoce:
La mquina donde se est ejecutando el servidor El puerto donde el servidor est escuchando.
p u e r t o l i s t e n
Servidor
Octubre 2007
Peticin de conexin
p u e r t o
Cliente
13
UNIVERSIDADE DA CORUA
El cliente enva una peticin de conexin al servidor, usando esa mquina y nmero puerto. Adems, el cliente tiene que identificarse ante el servidor, por tanto al cliente se le asigna un puerto en su mquina, que ser utilizado a lo largo de la conexin.
Normalmente esta asignacin la realiza el sistema.
UNIVERSIDADE DA CORUA
En el lado cliente, si la conexin es aceptada, se obtiene un socket conectado con el servidor. A partir de ah, cliente y servidor se comunican escribiendo y leyendo por sus respectivos sockets.
p u e r t o l i s t e n p u e r t o
Servidor
Conexin
Cliente
Clases:
java.net.Socket: Implementa un extremo de una conexin bidireccional. java.net.ServerSocket: Implementa un socket que los servidores pueden utilizar para escuchar y aceptar peticiones de clientes.
Octubre 2007
15
UNIVERSIDADE DA CORUA
Datagrama:
Mensaje independiente, enviado a travs de una red cuya llegada, tiempo de llegada y contenido no est garantizado.
El servidor se ejecuta en una mquina y crea un socket no orientado a conexin que est ligado a un nmero de puerto especfico.
A partir de ah el servidor recibe todos los datos enviados a ese puerto UDP, leyendo a travs de ese socket.
El cliente conoce:
La mquina donde se est ejecutando el servidor El puerto asociado al servidor.
Octubre 2007
16
UNIVERSIDADE DA CORUA
El cliente crea un socket no orientado a conexin ligado a un nmero de puerto especfico y lo utiliza para enviar Datagramas al servidor.
Normalmente la asignacin del nmero de puerto en el cliente la hace el sistema. Los Datagramas enviados deben contener la direccin y nmero de puerto del servidor al que van dirigidos.
Clases:
java.net.DatagramSocket java.net.DatagramPacket
Octubre 2007
17
Direcciones IP
Clase java.net.InetAddress:
Mtodos estticos:
InetAddress getByName(String host)
Obtiene la direccin IP de la mquina Recibe el nombre de la mquina o su direccin IP como cadena.
UNIVERSIDADE DA CORUA
InetAddress getLocalHost():
Obtiene la direccin IP de la mquina en la que se est ejecutando.
Mtodo:
public String getHostName()
Devuelve el nombre de la mquina correspondiente a esta IP.
Octubre 2007
18
UNIVERSIDADE DA CORUA
Clase: java.net.Socket
Octubre 2007
19
UNIVERSIDADE DA CORUA
Al llamar al constructor se crea el socket y si se indica la direccin y puerto del servidor ya se conecta con la mquina y puerto indicados. Constructores:
Socket() Socket(InetAddress dir, int puerto) Socket(InetAddress dir, int puerto, InetAddress dirLocal, int puertoLocal) Socket(String nombre, int puerto) Socket(String nombre, int puerto, InetAddress dirLocal, int puertoLocal)
Mtodos
void bind(SocketAddress bindpoint) void connect(SocketAddress endpoint) void connect(SocketAddress endpoint, int timeout)
Octubre 2007 Laboratorio de Redes de Comunicaciones 20
UNIVERSIDADE DA CORUA
Octubre 2007
21
UNIVERSIDADE DA CORUA
Octubre 2007
22
UNIVERSIDADE DA CORUA
Clases:
java.net.ServerSocket java.net.Socket
Octubre 2007 Laboratorio de Redes de Comunicaciones 23
UNIVERSIDADE DA CORUA
Al llamar al constructor se crea el socket servidor y si se indica el puerto ya se asocia a ese puerto. Constructores:
ServerSocket() ServerSocket(int puerto) ServerSocket(int puerto, int backlog)
backlog: Nmero de mximo de conexiones pendientes que aceptar el socket.
Mtodos:
void bind(SocketAddress endpoint) void bind(SocketAddress endpoint, int backlog)
Octubre 2007 Laboratorio de Redes de Comunicaciones 24
UNIVERSIDADE DA CORUA
Octubre 2007
25
UNIVERSIDADE DA CORUA
Cerrar el socket
dem cliente.
Octubre 2007
26
UNIVERSIDADE DA CORUA
Cerrar el socket
Clases:
java.net.DatagramSocket java.net.DatagramPacket
Octubre 2007
27
UNIVERSIDADE DA CORUA
Intercambio de datos
Enviar:
void send(DatagramPacket)
Recibir:
void receive(DatagramPacket)
Octubre 2007
28
UNIVERSIDADE DA CORUA
DatagramPacket(byte[] buf, int length, InetAddress addr, int port) DatagramPacket(byte[] buf, int offset, int length, InetAddress addr, int port)
buf : array con los datos que se van a enviar offset: desplazamiento dentro del array de datos a enviar length: nmero de bytes a enviar addr: direccin IP del destino port: nmero de puerto del destino
Octubre 2007
29
UNIVERSIDADE DA CORUA
Cerrar el socket
Clases:
java.net.DatagramSocket java.net.DatagramPacket
Octubre 2007
30
UNIVERSIDADE DA CORUA
Mtodos:
void bind(SocketAddress addr)
Intercambio de datos
dem cliente.
UNIVERSIDADE DA CORUA
UNIVERSIDADE DA CORUA
Esta informacin puede estar en: ficheros en disco, la red, memoria, programas, etc. Y puede ser de cualquier tipo: objetos, caracteres, imgenes, sonidos, etc.
Octubre 2007
33
UNIVERSIDADE DA CORUA
Octubre 2007
34
UNIVERSIDADE DA CORUA
Octubre 2007
35
Flujos de datos
Lectura
Abrir el flujo de datos Mientras hay informacin Leer informacin Cerrar el flujo de datos
UNIVERSIDADE DA CORUA
Escritura
Abrir el flujo de datos Mientras hay informacin Escribir informacin Cerrar el flujo de datos
Octubre 2007
36
UNIVERSIDADE DA CORUA
Flujos de caracteres
java.io.Reader, java.io.Writer
Normalmente son envoltorios sobre flujos de bytes.
El flujo de bytes se utiliza para realizar la E/S fsica, y el flujo de caracteres realiza la conversin entre caracteres y bytes.
UNIVERSIDADE DA CORUA
void close()
Cierra el flujo
Octubre 2007 Laboratorio de Redes de Comunicaciones 38
UNIVERSIDADE DA CORUA
void close()
Cierra el flujo
Octubre 2007
39
UNIVERSIDADE DA CORUA
UNIVERSIDADE DA CORUA
void close()
Cierra el flujo
Octubre 2007
41
UNIVERSIDADE DA CORUA
Mtodos:
String readLine()
Lee una lnea de texto. Devuelve la cadena leda o null si se alcanza el final del flujo.
void close()
Cierra el flujo
Octubre 2007
42
UNIVERSIDADE DA CORUA
Mtodos:
void println(String x)
Escribe la cadena especificada ms un fin de lnea
void flush()
Escribe lo que haya en el buffer de escritura
void close()
Cierra el flujo
Octubre 2007 Laboratorio de Redes de Comunicaciones 43
UNIVERSIDADE DA CORUA
Clase java.io.OutputStreamWriter:
Clase til para la conversin de objetos OutputStream a Writer. Hereda de Writer. Constructor:
OutputStreamWriter(OutputStream out)
Octubre 2007
44
Ficheros
UNIVERSIDADE DA CORUA
Unidad de almacenamiento contenida en: discos, cintas, etc. Clase para manejo de ficheros y directorios: java.io.File Constructores:
File(File parent,String child) File(String pathname) File(String parent,String child)
Octubre 2007
45
UNIVERSIDADE DA CORUA
String getParent()
Devuelve el path del directorio padre o null si no tiene.
String getPath()
Devuelve el path
String getAbsolutePath()
Devuelve el path absoluto
long lastModified()
Devuelve la hora de la ltima modificacin.
long length()
Devuelve el tamao.
UNIVERSIDADE DA CORUA
boolean exists()
Indica si existe un fichero o directorio con ese nombre
boolean isDirectory()
Indica si se trata de un directorio.
boolean isFile()
Indica si se trata de un fichero
boolean createNewFile()
Crea un fichero vaco con este nombre si no exista ya.
boolean mkdir()
Crea un directorio con este nombre
boolean mkdirs()
Crea un directorio con este nombre creando todos los directorios padre que sea necesario
String[] list()
Obtiene una lista de los ficheros y directorios contenidos en este directorio.
Octubre 2007
47
UNIVERSIDADE DA CORUA
UNIVERSIDADE DA CORUA
UNIVERSIDADE DA CORUA
Octubre 2007
50
UNIVERSIDADE DA CORUA
UNIVERSIDADE DA CORUA
UNIVERSIDADE DA CORUA
Programacin Multithread
UNIVERSIDADE DA CORUA
La programacin multihilo permite realizar muchas actividades simultneas en un programa. Los hilos -a veces llamados, procesos ligeros, o hilos de ejecucin- son ejecuciones concurrentes de un programa donde se comparten diversos recursos entre los distintos threads. Al estar estos hilos construidos en el mismo lenguaje, son ms fciles de usar que sus homlogos en C o C++. El beneficio de ser multihilo consiste en un mejor rendimiento interactivo y una mayor facilidad para modelar procesos concurrentes (como un servidor en Internet que debe atender a mltiples clientes de forma simultnea).
Octubre 2007
54
UNIVERSIDADE DA CORUA
Normalmente los programas estn formados por un nico hilo de ejecucin y su comportamiento es secuencial, tienen:
Un punto de inicio Una secuencia de ejecucin Un final
Cuando en un programa se quiere realizar ms de una tarea simultneamente se utilizan tcnicas de ejecucin concurrente, que permiten que diversos puntos del programa se estn ejecutando a la vez. Existen dos aproximaciones para ejecutar tareas de forma concurrente en un programa:
Procesos. Threads.
Octubre 2007 Laboratorio de Redes de Comunicaciones 55
UNIVERSIDADE DA CORUA
Al compartir recursos, los threads se crean ms rpido que los procesos y los cambios de contexto entre threads son ms baratos. Esta ventaja de los threads vara mucho segn el SO, siendo ms grande en Windows (donde la creacin de procesos es muy costosa). Como contrapartida, el mayor aislamiento que proporcionan los procesos hace ms fcil evitar problemas que surgen de la ejecucin concurrente sobre los mismos recursos. Ambas aproximaciones se pueden combinar en un mismo programa, que puede tener varios procesos, y cada uno de ellos con varios threads simultneos.
Laboratorio de Redes de Comunicaciones 56
Octubre 2007
UNIVERSIDADE DA CORUA
Octubre 2007
57
UNIVERSIDADE DA CORUA
Las aplicaciones Java bsicas estn formadas normalmente por un nico proceso con un nico thread, que invoca al mtodo main de la clase que se ejecuta.
Octubre 2007
58
UNIVERSIDADE DA CORUA
Para lograr concurrencia en un programa (hacer varias cosas a la vez, cuando unas tareas no dependen de otras). Para eliminar los tiempos de espera a los usuarios de un programa
Permiten hacer otro trabajo mientras el programa est bloqueado haciendo algo.
Servir a varios clientes en paralelo, sin que tengan que esperar a que terminen otros para ser atendidos. Para aprovechar las capacidades multiproceso de las CPUs actuales (Multithreading, Multicore) y conseguir una mejora de la eficiencia.
Ejemplos:
Servidores que aceptan conexiones de mltiples clientes (Servidores Web, FTP, correo, ) Almacenar un archivo en disco. Mostrar una barra de progreso de una operacin de una aplicacin.
Octubre 2007 Laboratorio de Redes de Comunicaciones 59
UNIVERSIDADE DA CORUA
La interfaz java.lang.Runnable
Se utiliza en los casos de que sea necesario la herencia mltiple
(por ejemplo cuando una clase ya hereda de otra, como un Applet).
NOTA:
Mtodo esttico Thread.sleep(int milisegs): duerme un proceso o un thread durante el tiempo especificado.
Octubre 2007
60
UNIVERSIDADE DA CORUA
Mtodo1: Para crear una clase que sea un thread (un hilo de ejecucin independiente):
class HijoThread extends Thread { HijoThread() { // Inicializacin } public void run() { // Tarea a ejecutar en el thread ... }
El programa principal:
Crea una instancia de la nueva clase:
HijoThread t = new HijoThread();
Inicia la ejecucin:
t.start();
Octubre 2007
61
UNIVERSIDADE DA CORUA
!unnable{
El programa principal:
Ms informacin
http://java.sun.com/docs/books/tutorial/
http://java.sun.com/docs/books/tutorial/reallybigindex.html
UNIVERSIDADE DA CORUA
Flujos de datos
http://java.sun.com/docs/books/tutorial/essential/io/index.html http://java.sun.com/docs/books/tutorial/essential/io/streams.html (Streams) http://java.sun.com/docs/books/tutorial/essential/io/fileio.html (Files)
Programacin concurrente
http://java.sun.com/docs/books/tutorial/essential/concurrency/threads.html (Threads)
Octubre 2007
63