Está en la página 1de 48

Diseo Y Aplicaciones de Sistemas Distribuidos

Java
Contenidos
Clases, objetos e interfaces a Java Threads en Java Interfaces grficas en Java (GUI)
Realizacin de interfaces grficas con Jbuilder 2

Procesamiento distribuido en Java

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia

Sockets en Java Java-RMI Java y CORBA Applets Servlets Seguridad en Java Gestores de seguridad URLs JDBC
Joan Vila

Procesamiento distribuido en Java

Java
Qu es Java?
Lenguaje orientado a objetos. Amplio soporte para programacin en red, distribuida y web Se ejecuta sobre una mquina virtual que puede correr sobre:
El sistema operativo: el bytecode se carga de un fichero. Un navegador web: el bytecode se carga de la red (sistema de ficheros remoto) utilizando HTTP (Applets).

Java
Network
javac

File system
f.class

f.java

Program loader

HW
Java virtual machine

Sistema de ventanas independiente de plataforma:


AWT (Abstract Window toolkit): utiliza ventanas proporcionadas por el sistema operativo Swing: se ejecuta directamente sobre el hardware

Procesamiento distribuido en Java

Joan Vila

Procesamiento distribuido en Java

Joan Vila

Java
Sistema ficheros

Diseo Y Aplicaciones de Sistemas Distribuidos


Red

Mquina Virtual Java

Cargador Verificador de cdigo Intrprete Soporte ejecucin Compilador instntaneo (JIT)

Clases, objetos e interfaces en Java

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia
Joan Vila

HW + SO
Procesamiento distribuido en Java 5

Introduccin a Java
Indice
Clases, objetos e interfaces
Herencia Declaracin de clases variables y mtodos Especificadores de acceso

Clases y objetos en Java


Variables Constructor class Rectangulo { int x, y, w, h; String nombreClase ="Rectangulo"; Rectangulo(int x, int y, int ancho, int alto){ this.x=x; this.y=y; w=ancho; h=alto; } int area(){ return (w*h); } void mover(int arriba, int derecha){ x+=arriba; y+=derecha; } String imprimir() { return "({" + Integer.toString(x) + "," + Integer.toString(y) + "},{" + Integer.toString(x+w) + "," + Integer.toString(y+h) + "})"; } String nombre(){ return nombreClase; } }
Joan Vila

El mtodo main La E/S: streams Excepciones Interfaces

Clase
Tipo abstracto de datos Puede manipularse a travs de una serie de mtodos bien definidos Mtodos

Procesamiento distribuido en Java

Procesamiento distribuido en Java

Joan Vila

Clases y objetos en Java

Herencia
package Geometria; Paquete = Conjunto de clases

Rectangulo R = new Rectangulo(0,0,2,3); R.area(); R.x = 7;

Objeto = Instancia de la clase


Referencias a miembros de la clase

class Rectangulo {
int x, y, w, h; ... Rectangulo(int x, int y, int ancho, int alto){ ... } int area(){ ... } ... }

class RectanguloColor extends Rectangulo {


int color; RectanguloColor(int x, int y, int ancho, int alto, int color){ super(x,y,ancho,alto); this.color=color; } int color(){ return color; } } Referencia a propia clase Referencia a superclase

class Cuadrado extends RectanguloColor {


} Procesamiento distribuido en Java
Joan Vila

Cuadrado(int x, int y, int lado, int color){ super(x,y,lado,lado,color); } int area(){ return (super.w*super.w); } Method overriding
Joan Vila

Procesamiento distribuido en Java

10

Herencia
Clase Geometria.Rectangulo

Interfaces
Interfaz: coleccin de definiciones de mtodos sin implementacin y valores constantes
Multiple inheritance Multiple inheritance not supported not supported interface Collection { interface Collection { int MAXIMUM = 500; int MAXIMUM = 500; void add(Object obj); void add(Object obj); void delete(Object obj); void delete(Object obj); Object find(Object obj); Object find(Object obj); int currentCount(); int currentCount(); } } class FIFOQueue implements Collection { class FIFOQueue implements Collection { ...... void add(Object obj) { void add(Object obj) { ...... } } void delete(Object obj) { void delete(Object obj) { ...... } } Object find(Object obj) { Object find(Object obj) { ...... } } int currentCount() { int currentCount() { ...... } } } }
Joan Vila

Clase Geometria.RectanguloColor = subclase de Geometria.Rectangulo

Clase Geometria.Cuadrado = subclase de Geometria.RectanguloColor RectanguloColor RC = new RectanguloColor(0,0,2,3,35); Cuadrado C = new Cuadrado(4,3,5,0); Herencia de mtodos y variables RC.color(); RC.area(); RC.color = 5; RC.x = 7 C.imprimir(); C.area(); C.color(); C.h = 7;
Procesamiento distribuido en Java
Joan Vila

11

Procesamiento distribuido en Java

12

Interfaces
Utilizacin de interfaces
Para definir un protocolo de comportamiento que puede ser implementado por cualquier clase en cualquier lugar de la jerarqua. Permiten: Obligar a determinadas clases a implementar un cierto protocolo o conjunto de mtodos. Conocer el interfaz de una clase sin conocer los detalles de su implementacin. Capturar similaridades entre clases sin forzar la relacin jerrquica. Dar solucin a problemas de herencia mltiple, p.e.: class Reloj extends Applet implements Runnable

Interfaces
Utilizacin de interfaces
En general, no es obligatorio declarar el interfaz de un objeto En objetos distribuidos es obligatorio declarar su interfaz

package RMI.Echo; package RMI.Echo; public interface EchoIntRMI extends java.rmi.Remote { public interface EchoIntRMI extends java.rmi.Remote { String echo(String aString) throws java.rmi.RemoteException; String echo(String aString) throws java.rmi.RemoteException; } }

Procesamiento distribuido en Java

Joan Vila

13

Procesamiento distribuido en Java

Joan Vila

14

Declaracin de clases
Declaracin de clases [modifiers] class ClassName [extends [implements InterfacesNames] { ... }

Declaracin de variables
Declaracin de variables [accessSpecifier] [static] [final] [transient] [volatile]. type variableName.
static: la variable es variable de clase. Lo contrario es variable de instancia. final: la variable es una constante. volatile: variable que puede ser modificada asncronamente por threads concurrentes.

SuperClassName]

public: Puede ser utilizada por objetos fuera de su paquete. Por defecto, slo puede utilizarse en el paquete. abstract: Puede contener mtodos abstractos (sin implementacin). No se instancian, slo se subclasean. final: No pueden derivarse subclases.

Procesamiento distribuido en Java

Joan Vila

15

Procesamiento distribuido en Java

Joan Vila

16

Declaracin de mtodos
Declaracin de mtodos [accessSpecifier] [static] [abstract] [final] [native] [synchronized] returnType methodName ([paramList]) [throws exceptionList] {... }
static: el mtodo es mtodo de clase. Lo contrario es mtodo de instancia. abstract: no tienen implementacin; slo definen una interfaz. final: no puede ser superpuesto (overridden ) por un mtod de una subclase. native: la implementacin del mtodo est hecha en otro lenguaje de programacin, p.e. C. synchronized: ejecucin en exclusin mtua.
Procesamiento distribuido en Java
Joan Vila

Especificadores de acceso
package Arco; import java.io.*; Variable de instancia accesible a subclases Variable de clase privada class Rectangulo { protected int x, y, w, h; private static String nombreClase ="Rectangulo"; public Rectangulo(int x, int y, int ancho, int alto){ this.x=x; this.y=y; w=ancho; h=alto; } public int area(){ return (w*h); } public void mover(int arriba, int derecha){ x+=arriba; y+=derecha; } public String imprimir() { return "({" + Integer.toString(x) + "," + Integer.toString(y) + "},{" + Integer.toString(x+w) + "," + Integer.toString(y+h) + "})"; } public static String nombre(){ return nombreClase; }
Joan Vila

Mtodo de instancia pblico Mtodo de clase pblico

17

} Procesamiento distribuido en Java

18

Especificadores de acceso
Especificador subclase paquete mundo clase *

El mtodo main
El mtodo main
El mtodo main de la clase cuyo nombre coincide con el nombre del fichero es el que inicia la ejecucin. Es static Recibe argumentos de tipo String en args[]

private protected Defecto (package) public

(*) :Slo si est en el mismo paquete


Procesamiento distribuido en Java
Joan Vila

19

Procesamiento distribuido en Java

Joan Vila

20

El mtodo main
package Arco; import java.io.*;

Manejo de excepciones
byte[] buffer = new byte[80]; try { System.out.println("Teclee una cadena"); j = System.in.read(buffer); System.out.write(buffer,0,j); System.out.println("Teclee un entero"); j = dis.readInt(); dos.writeInt(j); dos.flush(); } catch (IOException e) { Lista excepciones capturadas Manejador excepcin

public class Ejemplo1{ static Rectangulo R = new Rectangulo(0,0,2,3); static Cuadrado C; public static void main(String args[]) { if (args.length < 4){ System.out.println("Uso: Ejemplo1 x y l c"); System.exit(1); } int[] i = new int[4]; int j = 0; for(j=0; j < i.length; j++) i[j] = Integer.parseInt(args[j]); C = new Cuadrado(i[0],i[1],i[2],i[3]);
Procesamiento distribuido en Java

Integer.parseInt(args[j]);
clase mtodo de clase

Operaciones de E/S

Ambito excepcin

Manejo de arrays }

System.out.println("Error en lectura de teclado"); System.exit(1);

Joan Vila

21

Procesamiento distribuido en Java

Joan Vila

22

La E/S: streams
package Arco; import java.io.*;

La E/S: streams
Lectura/escritura de bytes int count; int count; byte[] buffer = new byte[256]; Lectura/escritura de cadenas byte[] buffer = new byte[256]; is = System.in; //de clase InputStream (UNICODE) con buffer implcito is = System.in; //de clase InputStream os = System.out; //de clase OutputStream os = System.out; //de clase OutputStream os.write(buffer,0,count); os.write(buffer,0,count); BufferedReader br = BufferedReader br = count=is.read(buffer); count=is.read(buffer); new BufferedReader( new BufferedReader( os.close(); is.close(); os.close(); is.close(); new InputStreamReader(is)); new InputStreamReader(is)); PrintWriter pw = new PrintWriter(os); PrintWriter pw = new PrintWriter(os); String inputLine; Lectura/escritura de datos String inputLine; dos = new DataOutputStream(os); dos = new DataOutputStream(os); dis = new DataInputStream(is); dis = new DataInputStream(is); count=dis.readInt(); count=dis.readInt(); dos.close(); dis.close(); dos.close(); dis.close();
Joan Vila

public class Ejemplo1{ static Rectangulo R = new Rectangulo(0,0,2,3); static Cuadrado C; public static void main(String args[]) { ... C = new Cuadrado(i[0],i[1],i[2],i[3]);

System.out.println(...)

clase variable mtodo System.out.println(R.nombre()); de clase System.out.println(Rectangulo.nombre()); System.out: es de clase OutputStream System.out.println(R.imprimir()); System.in: es de clase InputStream System.out.println(C.imprimir()); } }
Procesamiento distribuido en Java 23

inputLine = br.readLine(); inputLine = br.readLine(); pw.println(inputLine); pw.println(inputLine); pw.flush(); pw.flush(); os.close(); os.close(); is.close(); is.close();
Joan Vila

Procesamiento distribuido en Java

24

Diseo Y Aplicaciones de Sistemas Distribuidos

Threads en Java
Indice

Programacin concurrente en Java

La clase Thread El interfaz Runnable Sincronizacin de Threads en Java


Monitores en Java: mtodos synchronized Los mtodos wait y notifyAll

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia Procesamiento distribuido en Java
Joan Vila

26

Threads en Java
La clase Thread
La cualidad de hilo de ejecucin en Java se obtiene por herencia de la clase Thread Creacin: realizacin de subclases de Thread class Reloj extends Thread Cdigo a ejecutar: sobrecargar el mtodo run public void run() { ... } Otros mtodos que se pueden sobrecargar public void start() { ... } Se ejecuta al arrancar el thread.

Threads en Java
import java.text.*; import java.text.*; import java.util.*; import java.util.*;

class Reloj extends Thread {{ accomplished by class Reloj extends Thread accomplished by int cuenta=0; inheritance from the int cuenta=0; inheritance from the ... Thread class ... Thread class public void run() {{ public void run() for (int i i= 1; i i<= cuenta; i++) {{ for (int = 1; <= cuenta; i++) try {{ try sleep(1000); sleep(1000); }}catch (InterruptedException e) {} catch (InterruptedException e) {} System.out.println(getName() + ""::""+ (cuenta --i)); System.out.println(getName() + + (cuenta i)); }} System.out.println(getName() + "Riiinnnng!!!"); System.out.println(getName() + "Riiinnnng!!!"); }} }}
Procesamiento distribuido en Java
Joan Vila

Concurrent execution Concurrent execution

Procesamiento distribuido en Java

Joan Vila

27

28

Threads en Java
Instancias e iniciacin de Threads
public class Relojes { public class Relojes { public static void main(String[] args){ public static void main(String[] args){ new Reloj("MotorOn",10).start(); new Reloj("MotorOn",10).start(); new Reloj("MotorOff",15).start(); new Reloj("MotorOff",15).start(); } } } }

Threads en Java
El interfaz Runnable
Se utiliza cuando no se puede heredar de la clase Thread por problemas de herencia mltiple. Solucin:
Implementar Runnable (obliga a sobrecargar run, ...) Crear una instancia de Thread y pasarle como agumento el objeto class X extends UnicastRemoteObject implements Runnable { Thread reloj= new Thread(this, "Reloj"); public void run(){ while(this !=null){ f(); try{ Thread.sleep(5); }catch(InterruptedException e){} } } }

Procesamiento distribuido en Java

Joan Vila

29

Procesamiento distribuido en Java

Joan Vila

30

Sincronizacin de Threads en Java


Monitores en Java
La sincronizacin en Java se basa en el concepto de Monitor (de C.A.R. Hoare). TAD: encapsula datos y operaciones. Exclusin mtua en el acceso al monitor: slo puede haber un proceso activo ejecutando cdigo del monitor.

Sincronizacin de Threads en Java


Mtodos wait y notifyAll
Existen mtodos de la clase Object que permiten realizar esperas condicionales dentro de un monitor.
wait() : Suspende el thread hasta que otro thread lo notifica con notifyAll() (o notify()). notifyAll() : Activa todos los threads suspendidos (con wait()) en el monitor adquirido por el thread que invoca. wait(long timeout) notify()

Mtodos sincronizados
Cuando el control entra en un mtodo sincronizado (synchronized), el thread que lo invoc adquiere el monitor e impide que otros threads puedan ejecutar mtodos sincronizados del monitor.

Procesamiento distribuido en Java

Joan Vila

31

Procesamiento distribuido en Java

Joan Vila

32

Sincronizacin de Threads en Java


class Producer extends Thread { class Producer extends Thread { private CubbyHole cubbyhole; private CubbyHole cubbyhole; private int number; private int number; public Producer(CubbyHole c, int number) { public Producer(CubbyHole c, int number) { cubbyhole = c; cubbyhole = c; this.number = number; this.number = number; } } public void run() { public void run() { for (int i i= 0; i i< 10; i++) { for (int = 0; < 10; i++) { cubbyhole.put(i); cubbyhole.put(i); System.out.println("Producer #" + this.number System.out.println("Producer #" + this.number + ""put: ""+ i); + put: + i); try { try { sleep((int)(Math.random() * 100)); sleep((int)(Math.random() * 100)); } catch (InterruptedException e) { } catch (InterruptedException e) { } } } } } }
Joan Vila

Sincronizacin de Threads en Java


class Consumer extends Thread { class Consumer extends Thread { private CubbyHole cubbyhole; private CubbyHole cubbyhole; private int number; private int number; public Consumer(CubbyHole c, int number) { public Consumer(CubbyHole c, int number) { cubbyhole = c; cubbyhole = c; this.number = number; this.number = number; } } public void run() { public void run() { int value = 0; int value = 0; for (int i i= 0; i i< 10; i++) { for (int = 0; < 10; i++) { value = cubbyhole.get(); value = cubbyhole.get(); System.out.println("Consumer #" + this.number System.out.println("Consumer #" + this.number + ""got: ""+ value); + got: + value); } } } }
Joan Vila

} }

} }
33

Procesamiento distribuido en Java

Procesamiento distribuido en Java

34

Sincronizacin de Threads en Java


class CubbyHole { class CubbyHole { private int contents; // this is the condition variable. private int contents; // this is the condition variable. private boolean available = false; private boolean available = false; public synchronized int get() { public synchronized int get() { while (available == false) { while (available == false) { try { try { wait(); wait(); } catch (InterruptedException e) { } } catch (InterruptedException e) { } } } public synchronized void put(int value) { public synchronized void put(int value) { available = false; available = false; while (available == true) { while (available == true) { notifyAll(); notifyAll(); try { try { return contents; return contents; wait(); wait(); } } } catch (InterruptedException e) {} } catch (InterruptedException e) {} } } contents = value; contents = value; available = true; available = true; notifyAll(); notifyAll(); } } 35 } Procesamiento distribuido en Java Joan Vila }

Sincronizacin de Threads en Java

class ProducerConsumerTest { class ProducerConsumerTest { public static void main(String[] args) { public static void main(String[] args) { CubbyHole cc= new CubbyHole(); CubbyHole = new CubbyHole(); Producer p1 = new Producer(c, 1); Producer p1 = new Producer(c, 1); Consumer c1 = new Consumer(c, 1); Consumer c1 = new Consumer(c, 1); p1.start(); p1.start(); c1.start(); c1.start();

} }

} }

Procesamiento distribuido en Java

Joan Vila

36

Diseo Y Aplicaciones de Sistemas Distribuidos

Java - GUI
Indice
Componentes del AWT
Componentes bsicos Containers Layout managers

Interfaz grfica en Java Java - GUI


Graphical User Interface

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia

Un ejemplo Utilizacin de Frames Manejo de eventos Proceso de dibujo en AWT

Procesamiento distribuido en Java

Joan Vila

38

Java - GUI
Componetes del AWT (Abstract Window Toolkit) Componentes bsicos
Button Checkbox Choice List Label MenuItem TextField TextArea Canvas

Java AWT: componentes

Containers
Frame Dialog FileDialog

Layout Managers
Border Card Flow Grid GridBagLayout

Procesamiento distribuido en Java

Joan Vila

39

Procesamiento distribuido en Java

Joan Vila

40

Java AWT: componentes bsicos

Java AWT: componentes bsicos


Uso de Button
b1 = new Button(); b1.disable();

Uso de textField y textArea


// En la inicializacin TextField textField; TextArea textArea; textField = new TextField(20); textArea = new TextArea(5, 20); textArea.setEditable(false); ... // En los manejadores de eventos String text = textField.getText(); textArea.appendText(text + "\n"); textField.selectAll();

Uso de Choice
choice = new Choice(); choice.addItem("ichi"); choice.addItem("ni"); choice.addItem("san"); choice.addItem("yon"); int i = choice.getSelectedIndex() String S = choice.getSelectedItem());
Procesamiento distribuido en Java
Joan Vila

41

Procesamiento distribuido en Java

Joan Vila

42

Java AWT: componentes bsicos


Uso de CheckBox
Checkbox cb1, cb2, cb3; //These are independent checkboxes. Checkbox cb4, cb5, cb6; //These checkboxes are part of a group. CheckboxGroup cbg; cb1 = new Checkbox(); //Default state is "off" (false). cb1.setLabel("Checkbox 1"); cb2 = new Checkbox("Checkbox 2"); cb3 = new Checkbox("Checkbox 3"); cb3.setState(true); //Set state to "on" (true). ... cbg = new CheckboxGroup(); cb4 = new Checkbox("Checkbox 4", cbg, false); //initial state: off (false) cb5 = new Checkbox("Checkbox 5", cbg, false); //initial state: off cb6 = new Checkbox("Checkbox 6", cbg, false); //initial state: off
Procesamiento distribuido en Java
Joan Vila

Java AWT: containers


Containers Frame: proporciona ventanas para applets y aplicaciones. Dialog: Ventanas dependientes de frame que se iconizan cuando el correspondiente Frame se iconiza. Se utilizan para formular preguntas FileDialog: Dialog para seleccionar un fichero. No puede visualizarse en un applet. Panel: sirven para agrupar componentes bsicos

43

Procesamiento distribuido en Java

Joan Vila

44

Java AWT: layout managers

Un ejemplo

Tambin es posible trabajar con posicionamiento absoluto


Procesamiento distribuido en Java
Joan Vila

45

Procesamiento distribuido en Java

Joan Vila

46

Utilizacin de Frames
public class UnFrame extends Frame implements WindowListener { // Declarar layout GridBagLayout gridBagLayout1 = new GridBagLayout(); // Declarar componentes Button botonEnviar = new Button(); Label label1 = new Label(); TextField textoHost = new TextField(); public UnFrame() { // Inicializar componentes botonEnviar.setLabel("SEND"); ... // Establecer un Layout this.setLayout(gridBagLayout1); // Aadir componentes al Frame this.add(botonEnviar, ...); this.add(label1, ...); this.add(textoHost, ...); }
Procesamiento distribuido en Java
Joan Vila

Utilizacin de Frames
public class UnFrame extends Frame implements WindowListener { ... public static void main(String[] args) { // Declarar un objeto de tipo Frame y visualizarlo UnFrame UnFrame1 = new UnFrame(); UnFrame1.addWindowListener(echoFrame1); UnFrame1.show(); } // Define window listeners. public void windowClosing( WindowEvent event ) {dispose(); System.exit(1);} public void windowOpened( WindowEvent event ) {} ...

}
47 Procesamiento distribuido en Java
Joan Vila

48

Manejo de eventos
Eventos
La pulsacin de un botn, retorno de carro en un campo de texto, etc..., produce eventos asncronos a los que se les puede declarar funciones para manejarlos. Estas funciones estn definidas en una serie de interfaces y clases del paquete java.awt.event

Manejo de eventos
Eventos
Un componente, como p.e. un Button puede generar dos tipos de eventos Bajo nivel: eventos no especficos del componente, como p.e., MouseEvent al ser visitado, abandonado o presionado por el ratn, etc... Alto nivel: evento con acciones especficas del componente como p.e., ActionEvent al ser presionado, que evita procesar eventos poco relevantes (semnticamente) como movimientos o clicks del ratn
El evento ActionEvent se propaga a cada objeto que implemente la interfaz ActionListener y que se haya registrado para recibir dicho evento, utilizando para ello el mtodo AButton.addActionListener(ActionListener l) del correspondiente componente. La interfaz ActionListener obliga a implementar un actionPerformed(ActionEvent e) que sirve para manejar el evento. mtodo

Procesamiento distribuido en Java

Joan Vila

49

Procesamiento distribuido en Java

Joan Vila

50

Manejo de eventos
Eventos: un ejemplo.
La pulsacin de un botn.
Button boton1 = new Button(); boton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { boton_manejador(e); } });

Proceso de dibujo en AWT


Cmo dibuja el AWT?
Los programas dibujan slo cuando el AWT se lo permite. La razn es hacerlo de manera ininterrumpida. El AWT realiza los dibujos desde un nico thread. La secuencia es:
repaint(): mtodo invocado por un componente para planificar una orden de dibujo update(): mtodo de un componente que el AWT invoca cuando le llega el turno de dibujar. Por defecto, lo que hace es: Limpiar el hueco del componente Invocar el mtodo paint() del componente. El mtodo paint() no hace nada por defecto.

Procesamiento distribuido en Java

Joan Vila

51

Procesamiento distribuido en Java

Joan Vila

52

Proceso de dibujo en AWT


El objeto Graphics
El nico argumento de los mtodos paint() y update() es un objeto Graphics que representa el contexto en el que un componente puede dibujarse. La clase Graphics proporciona mtodos para:
Dibujar y rellenar rectngulos, arcos, lneas, valos, polgonos, texto e imgenes. Obtener o fijar el color o fuente actual Fijar el modo de dibujo.

Como realizar un componente grfico?


public class RobotGrafico extends Component{ public RobotGrafico(...) { super(); this.setBackground(new Color(124, 178, 193)); this.setForeground(Color.gray); ...} public Dimension getMinimumSize(){ return new Dimension(...); } public Dimension getPreferredSize(){ ... } public void paint(Graphics g) { g.setColor(Color.blue); g.fillOval(...); g.drawLine(...); ...} } Procesamiento distribuido en Java
Joan Vila

Cmo dibujar?
La manera ms fcil de dibujar es poner cdigo (sobrecaragar) el mtodo paint():
public void paint(Graphics g) {{ public void paint(Graphics g) Dimension d = size(); Dimension d = size(); g.drawRect(0,0, d.width --1, d.height --1); g.drawRect(0,0, d.width 1, d.height 1); }}
Procesamiento distribuido en Java
Joan Vila

53

54

Como realizar un componente grfico?


public class Consola extends JApplet implements Runnable, WindowListener{ BevelPanel pnlEscenario = new BevelPanel(); rbtg= new RobotGrafico(...); public Consola() { jbInit(); ...} private void jbInit() throws Exception { ... pnlEscenario.add(rbtg, ...); pnlEscenario.validate(); this.getContentPane().add(pnlEscenario, ...); ...} public void run(){ pnlEscenario.repaint(); try{Thread.sleep(400);} catch(Exception e){} ...} ...} Procesamiento distribuido en Java
Joan Vila

Diseo Y Aplicaciones de Sistemas Distribuidos

Realizacin de interfaces grficas con JBuilder

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia 55

Interfaces grficas con JBuilder

Interfaces grficas con JBuilder


Cdigo generado
// *** Definir el paquete package gui; import java.awt.*; import borland.jbcl.layout.*; import java.awt.event.*; // *** Importar paquetes adicionales al AWT y JBCL import java.io.*; import java.rmi.*;

Codigo adicional

Procesamiento distribuido en Java

Joan Vila

57

Procesamiento distribuido en Java

Joan Vila

58

Interfaces grficas con JBuilder


// *** El frame y los componentes AWT public class EchoFrame extends Frame implements WindowListener { GridBagLayout gridBagLayout1 = new GridBagLayout(); Button botonEnviar = new Button(); Label label1 = new Label(); TextField textoHost = new TextField(); Label label2 = new Label(); TextField textoEnviar = new TextField(); Label label3 = new Label(); Label etiqRecibido = new Label();

Interfaces grficas con JBuilder


public class EchoFrame extends Frame implements WindowListener { ... // *** El constructor public EchoFrame() { try { jbInit(); } catch (Exception e) { e.printStackTrace(); } } // *** El mtodo main public static void main(String[] args) { EchoFrame echoFrame1 = new EchoFrame(); echoFrame1.addWindowListener(echoFrame1); echoFrame1.show(); }
Joan Vila

Procesamiento distribuido en Java

59

Procesamiento distribuido en Java

Joan Vila

60

Interfaces grficas con JBuilder


// La inicializacin de los componentes AWT private void jbInit() throws Exception { this.setSize(new Dimension(426, 132)); botonEnviar.setLabel("SEND"); botonEnviar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { botonEnviar_actionPerformed(e); } }); label1.setText(" Host: "); textoHost.setText("localhost"); ... this.setLayout(gridBagLayout1); this.add(botonEnviar, new GridBagConstraints2(0, 0, 1, 1, 0.0, 0.0 ,GridBagConstraints.CENTER, GridBagConstraints.VERTICAL, new Insets(0, 0, 0, 0), 27, 0)); ...
Procesamiento distribuido en Java

Interfaces grficas con JBuilder


// *** Los manejadores de eventos // Manejador de eventos del boton void textoEnviar_actionPerformed(ActionEvent e) { accion_echo(e); } // Manejador de eventos del campo de texto void botonEnviar_actionPerformed(ActionEvent e) { accion_echo(e); }

Joan Vila

61

Procesamiento distribuido en Java

Joan Vila

62

Interfaces grficas con JBuilder


// *** El manejador de eventos void accion_echo(ActionEvent e) { String host = new String(textoHost.getText()); String input = new String(textoEnviar.getText()); String output = new String("Error!"); try { EchoIntRMI obj = (EchoIntRMI)Naming.lookup("//"+host+"/EchoObject"); output = obj.echo(input); etiqRecibido.setText(output); } catch (UnknownHostException x) { etiqRecibido.setText("Unknown host: " + host + x.getMessage()); } catch (IOException x) { etiqRecibido.setText("Unable to connect or port already in use"); } catch (Exception x) { System.out.println("EchoRMI exception: " + x.getMessage()); x.printStackTrace(); }
Procesamiento distribuido en Java }
Joan Vila

Interfaces grficas con JBuilder


// *** Los manejadores de eventos de ventanas public void windowClosing( WindowEvent event ) { dispose(); System.exit(1); } public void windowOpened( WindowEvent event ) {} public void windowIconified( WindowEvent event ) {} public void windowDeiconified( WindowEvent event ) {} public void windowClosed( WindowEvent event ) {} public void windowActivated( WindowEvent event ) {} public void windowDeactivated( WindowEvent event ) {} } }

63

Procesamiento distribuido en Java

Joan Vila

64

Diseo Y Aplicaciones de Sistemas Distribuidos

Procesamiento distribuido en Java


Facilidades para procesamiento distribuido en Java

Sockets en Java

Java dispone de los siguientes componentes para procesamiento distribuido:


Sockets: API del protocolo de transporte TCP/IP URLs: API para trabajo con streams utilizando descriptores de ubicacin de internet (URLs). Gestor de seguridad: Clase abstracta que proporciona un interfaz de programacin y una implementacin parcial por defecto para todos los gestores de seguridad Java-RMI: Modelo de objetos distribuidos transparente a mtodos de objetos remotos. que proporciona invocain

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia

Applets: Aplicaciones con interfaz grfica para visor de www. JDBC: API para tener acceso a bases de datos remotas y ejecutar desde Java sentencias SQL. Joe: Extensin de Java para proporcionar acceso desde Java a sistemas heterogneos de tipo CORBA: Procesamiento distribuido en Java
Joan Vila

66

Sockets en Java
Indice
Comunicacin orientada a conexin: Sockets TCP Datagramas: Sockets UDP Multicast

Sockets en Java
Sockets en Java
El API de Java a los sockets TCP/IP se fundamenta en las siguientes clases: Comunicacin con conexin: sockets TCP
clase Socket : la utilizan los clientes clase ServerSocket : la utilizan los servidores

Comunicacin sin conexin (datagramas): sockets UDP


clase DatagramSocket clase DatagramPacket

Difusin de datagramas: sockets Multicast


clase MulticastSocket

Procesamiento distribuido en Java

Joan Vila

67

Procesamiento distribuido en Java

Joan Vila

68

Sockets en Java
Protocolos con conexin versus sin conexin

Sockets TCP
Sockets TCP: el cliente Sockets TCP: el cliente

Sin conexin

Origen

Destino

La clase socket La clase socket Socket s = new Socket(server, port); Socket s = new Socket(server, port); OutputStream os = s.getOutputStream(); OutputStream os = s.getOutputStream(); InputStream is = s.getInputStream(); InputStream is = s.getInputStream(); s.close(); s.close();

Sockets TCP: el servidor Sockets TCP: el servidor


La clase ServerSocket La clase ServerSocket ServerSocket servSock = new ServerSocket(port); ServerSocket servSock = new ServerSocket(port); Socket clientSock = servSocket.accept(); Socket clientSock = servSocket.accept(); servSock.close(); servSock.close();

Con Conexin

Origen

Destino

Procesamiento distribuido en Java

Joan Vila

69

Procesamiento distribuido en Java

Joan Vila

70

Sockets TCP
Ejemplo: un cliente de eco TCP (i)
import java.io.*; import java.net.*; public class Echo { public static void main(String[] args) { if (args.length<2) { System.out.println("Uso: echo host port"); System.exit(1); } Socket echoSocket = null; OutputStream os = null; InputStream is = null; ...

Sockets TCP
Ejemplo: un cliente de eco TCP (ii)
public class Echo { public static void main(String[] args) { ... try { echoSocket = new Socket(args[0],Integer.parseInt(args[1])); os = echoSocket.getOutputStream(); is = echoSocket.getInputStream(); } catch (UnknownHostException e) { System.err.println("Don't know about host: "+args[0]); } catch (IOException e) { System.err.println("Couldn't get I/O for connection to: "+args[0]); }

Procesamiento distribuido en Java

Joan Vila

71

Procesamiento distribuido en Java

Joan Vila

72

Sockets TCP
Ejemplo: un cliente de eco TCP (iii)
public class Echo { public static void main(String[] args) { ... if (echoSocket != null && os != null && is != null) { try { byte[] bufferin = new byte[256]; byte[] bufferout = new byte[256]; int count; String salida; while ((count = System.in.read(bufferin)) != -1) { os.write(bufferin,0,count); count=is.read(bufferout); salida = new String(bufferout,0,count); System.out.print("echo: " + salida); if (salida.equals("Bye"+"\r\n")) break; Procesamiento} distribuido en Java

Sockets TCP
Ejemplo: un cliente de eco TCP (iv)
public class Echo { public static void main(String[] args) { ... if (echoSocket != null && os != null && is != null) { try { ... os.close(); is.close(); echoSocket.close(); } catch (IOException e) { System.err.println("I/O failed on connection to: "+args[0]); } } } }
Joan Vila

73

Procesamiento distribuido en Java

Joan Vila

74

Sockets TCP
Ejemplo: un servidor de eco TCP (i)
import java.net.*; import java.io.*; class EchoServer { public static void main(String[] args) { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(4444); } catch (IOException e) { System.out.println("Could not listen on port: " + 4444 + ", " + e); System.exit(1); } ...

Sockets TCP
Ejemplo: un servidor de eco TCP (ii)
class EchoServer { public static void main(String[] args) { ... Socket clientSocket = null; try { clientSocket = serverSocket.accept(); } catch (IOException e) { System.out.println("Accept failed: " + 4444 + ", " + e); System.exit(1); } ...

Procesamiento distribuido en Java

Joan Vila

75

Procesamiento distribuido en Java

Joan Vila

76

Sockets TCP
Ejemplo: un servidor de eco TCP (iii)
try { InputStream is = clientSocket.getInputStream())); OutputStream os = clientSocket.getOutputStream(); byte[] bufferin = new byte[256]; int count; String linea; while ((count = System.in.read(bufferin)) != -1) { os.println(bufferin); os.flush(); linea = new String(bufferin,0,count); if (linea.equals("Bye")) break; } os.close(); is.close(); clientSocket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } Procesamiento distribuido en Java }
Joan Vila

Sockets TCP
Un servidor de echo multi-hilo en Java (i)
class EchoMultiServer { public static void main(String[] args) { ServerSocket serverSocket = null; boolean listening = true; try { serverSocket = new ServerSocket(7); } catch (IOException e) { System.err.println("Could not listen on port: 7, " + e.getMessage()); System.exit(1); } System.out.println("EchoMultiServer listening on port: 7");

77

Procesamiento distribuido en Java

Joan Vila

78

Sockets TCP
Un servidor de echo multi-hilo en Java (ii)
class EchoMultiServer { public static void main(String[] args) { ... while (listening) { Socket clientSocket = null; try { clientSocket = serverSocket.accept(); } catch (IOException e) { System.err.println("Accept failed on port: 7, " + e.getMessage()); continue; } new EchoMultiServerThread(clientSocket).start(); } try { serverSocket.close(); } catch (IOException e) { System.err.println("Could not close server socket." + e.getMessage()); } 79 Procesamiento distribuido en Java Joan Vila } }

Sockets TCP
Un servidor de echo multi-hilo en Java (iii)
class EchoMultiServerThread extends Thread { Socket clientSocket = null; EchoMultiServerThread(Socket socket) { super("EchoMultiServerThread"); clientSocket = socket; }

Ojo!: caracteres Unicode

public void run() { try { BufferedReader is = new BufferedReader(new InputStreamReader( clientSocket.getInputStream())); PrintWriter os = new PrintWriter(clientSocket.getOutputStream()); String inputLine;
Procesamiento distribuido en Java
Joan Vila

80

Sockets TCP
Un servidor de echo multi-hilo en Java (iv)
class EchoMultiServerThread extends Thread { ... public void run() { ... while ((inputLine = is.readLine()) != null) { os.println(inputLine); os.flush(); } os.close(); is.close(); clientSocket.close(); } catch (IOException e) { System.err.println("Error sending/receiving" + e.getMessage()); e.printStackTrace(); } } }
Procesamiento distribuido en Java
Joan Vila

Sockets UDP
Sockets UDP: el cliente
DatagramSocket socket = new DatagramSocket(); // send packet byte[] msg = {'H', 'e', 'l', 'l', 'o'}; port = Integer.parseInt(args[1]); address = InetAddress.getByName(args[0]); DatagramPacket packet = new DatagramPacket(msg, lenght, address, port); socket.send(packet); // receive packet byte[] buf = new byte[4096]; packet = new DatagramPacket(buf, 256); socket.receive(packet); socket.close();
Procesamiento distribuido en Java
Joan Vila

81

82

Sockets UDP en Java


Sockets UDP: el servidor
DatagramSocket socket = new DatagramSocket(7); DatagramPacket packet = new DatagramPacket(buf,4096); // receive packet socket.receive(packet); String received = new String(packet.getData(),0,packet.getLength());

Sockets multicast en Java


Sockets multicast
// join a Multicast group and send the group salutations byte[] msg = {'H', 'e', 'l', 'l', 'o'}; InetAddress group = InetAddress.getByName("228.5.6.7"); MulticastSocket s = new MulticastSocket(6789); s.joinGroup(group); DatagramPacket hi = new DatagramPacket(msg, msg.length, group, 6789); s.send(hi); // get their responses! byte[] buf = new byte[1000]; DatagramPacket recv = new DatagramPacket(buf, buf.length); s.receive(recv); ... // OK, I'm done talking - leave the group... s.leaveGroup(group);

Procesamiento distribuido en Java

Joan Vila

83

Procesamiento distribuido en Java

Joan Vila

84

Diseo Y Aplicaciones de Sistemas Distribuidos

JAVA-RMI
JAVA-RMI: Java Remote Method Invocation
Sistema de invocacin de mtodos remotos que (a diferencia de CORBA) asume un entorno homogneo de Mquina Virtual Java. Proporciona un modelo de objetos distribuidos similar al de Java, integrndolo en el lenguaje de manera natural. En este sentido permite:
Invocar mtodos de interfaces remotas Pasar una referencia a un objeto remoto en una invocacin (local o remota) Soportar callbacks de servidores a Applets.

Invocacin de mtodos remotos en Java: JAVA - RMI

Presenta algunas limitaciones respecto al modelo de objetos de Java


Los clientes siempre interaccionan con las interfaces, nunca con las implementaciones.

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia

Los argumentos no remotos de la invocaciones y los resultados siempre se pasan por copia, nunca por referencia. Los objetos remotos se pasan por referencia no por copia Existen excepciones adicionales que pueden ocurrir durante una RMI.
Procesamiento distribuido en Java
Joan Vila

86

Java-RMI
Arquitectura de JAVA-RMI

Java-RMI
Concurrencia en Java-RMI
Cuando varios clientes invocan mtodos concurrentemente sobre un objeto servidor son, en general, ejecutados por diferentes hilos.
Server object

Client object

Invocaciones de clientes diferentes son siempre ejecutadas en hilos diferentes. Invocaciones del mismo cliente pueden no ser ejecutadas por hilos diferentes dependiendo de la implementacin de la mquina virtual.
Client object Server object

Stubs

Skeletons Objects references level Transport level Client object

Procesamiento distribuido en Java

Joan Vila

87

Procesamiento distribuido en Java

Joan Vila

88

Java-RMI
Generacin de stubs y skeletons
Generados automticamente por un preprocesador llamado rmic Se generan a partir del fichero de implementacin del objeto servidor (no a partir de su interfaz)

Java-RMI

Client

Server Interface

Server

Servicio de nombres
Los nombres no son transparentes a la ubicacin: //host/objectName Se accede a travs de la clase java.rmi.Naming
Cliente: Remote ref = Naming.lookup("//" +host + "/NombreObjeto"); Servidor: Naming.rebind("//" + myURL + "/NombreObjeto", obj); javac
lookup rebind

javac

Client Stub

rmi registry

Server Skeleton

En todo host donde residan servicios, debe ejecutarse un servidor de nombres, llamado rmiregistry. Este servidor slo mantiene entradas de servicios locales.
Procesamiento distribuido en Java
Joan Vila

rmic
Procesamiento distribuido en Java
Joan Vila

89

90

Java-RMI
Objetos como argumentos en invocaciones
Los objetos se pueden pasar por valor o por referencia en las invocaciones a mtodos remotos. Paso por valor: los objetos locales se pasan por valor (migration) Pass by reference: los objetos remotos se pasan por referencia Serializacion de objetos: Java-RMI dispone de un sofisticado mecanismo de serializacin que permite convertir objetos en secuencias de bytes aptos de ser enviados por un OutputStream como,p.e., un socket. Los objetos pasados por valor deben implementar la interfaz Serializable.
class aClass implements java.io.Serializable; aclass X; ObjectOutputStream os = new ObjectOutputStream(sock.getOutputStream()); os.writeObject(x);
Procesamiento distribuido en Java
Joan Vila

Java-RMI
Clases e interfaces RMI
java.rmi and java.rmi.server java.rmi and java.rmi.server
Interfaces
Remote RemoteObject Defined in packages Defined in packages

Classes
IOException

RemoteServer

RemoteException extends

UnicastRemoteObject

Implements
Joan Vila

91

Procesamiento distribuido en Java

92

Java-RMI
Clases e interfaces RMI
Todos los objetos servidores RMI deben declarar un interfaz. Este interfaz debe ser subclase de java.rmi.remote.
Oblifga a propagar excepciones de comunicacin en la declaracin de mtodos.

Un ejemplo en Java-RMI (i)


Un ejemplo simple
La aplicacin echo
de da er e o t e H em R

La interfaz del servicio


public interface EchoIntRMI extends java.rmi.Remote {

La clase java.rmi.server.RemoteObject proporciona la semntica de la clase Object para objetos remotos:


igualdad, conversin a String

String echo(String aString) throws java.rmi.RemoteException;

La clase java.rmi.server.RemoteServer mtodos para crear y exportar objetos.

proporciona

La clase UnicastRemoteObject es una especializacin de la anterior que proporciona soporte para invocar objetos (no replicados).

Ex c es epc pe ion cf ica es s

Procesamiento distribuido en Java

Joan Vila

93

Procesamiento distribuido en Java

Joan Vila

94

Un ejemplo en Java-RMI (i)


El cliente de echo
Java siempre resuelve las referencias remotas en tiempo de ejecucin (late binding).

Un ejemplo en Java-RMI (i)


package RMI.Echo; package RMI.Echo; import java.io.*; import java.io.*; import java.rmi.*; import java.rmi.*;

El cliente de echo
EchoRMI.java

Interfaz objeto remoto Binding


Narrow ing

public interface EchoIntRMI extends java.rmi.Remote { ... } ...


Remote ref = Naming.lookup("//" +host + "/EchoObject"); EchoIntRMI eo = (EchoIntRMI) ref; eo.echo(hola);
In de s ace terf

go alo Cat

Procesamiento distribuido en Java

Joan Vila

95

public class EchoRMI { { public class EchoRMI public static void main(String[] args) { { public static void main(String[] args) if (args.length<1) { { if (args.length<1) System.out.println("Usage: Echo <host>"); System.exit(1); System.out.println("Usage: Echo <host>"); System.exit(1); }} try { { try EchoIntRMI obj = (EchoIntRMI) Naming.lookup("//"+args[0]+"/EchoObject"); EchoIntRMI obj = (EchoIntRMI) Naming.lookup("//"+args[0]+"/EchoObject"); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); String input,output; String input,output; while ((input = stdIn.readLine()) != null) { { while ((input = stdIn.readLine()) != null) output = obj.echo(input); output = obj.echo(input); System.out.println("echo: ""+ output); System.out.println("echo: + output); }} } }catch (Exception e) { { catch (Exception e) System.out.println("EchoRMI exception: ""+ e.getMessage()); System.out.println("EchoRMI exception: + e.getMessage()); }} }} }} Procesamiento distribuido en Java Joan Vila

96

Un ejemplo en Java-RMI (i)


El objeto echo (i)
EchoObjectRMI.java
package RMI.Echo; package RMI.Echo; import java.rmi.*; import java.rmi.*; import java.rmi.server.UnicastRemoteObject; import java.rmi.server.UnicastRemoteObject; import java.net.InetAddress; import java.net.InetAddress; public class EchoObjectRMI public class EchoObjectRMI extends UnicastRemoteObject implements EchoIntRMI extends UnicastRemoteObject implements EchoIntRMI { { public EchoObjectRMI() throws RemoteException {{ public EchoObjectRMI() throws RemoteException super(); super(); } } public String echo(String aString) throws RemoteException {{ public String echo(String aString) throws RemoteException return aString; return aString; } }
Procesamiento distribuido en Java Implementa el interfaz Constructor

Un ejemplo en Java-RMI (i)


El objeto echo (i): mtodo main
public static void main(String args[]) { System.setSecurityManager(new RMISecurityManager()); String myURL="localhost"; try { EchoObjectRMI obj = new EchoObjectRMI(); myURL=InetAddress.getLocalHost().getHostName(); Naming.rebind("//" + myURL + "/EchoObject", obj); } catch (Exception e) { System.out.println("EchoObject error: " + e.getMessage()) } } }
Joan Vila

Instanciar un Gestor Seguridad

Instanciar la clase Registrar objeto en el servicio de nombres

Proporcionar implementacion a los mtodos

97

Procesamiento distribuido en Java

Joan Vila

98

JAVA-RMI
Migracin de objetos
La aplicacin ComputeEngine
Enviar Tarea ComputePi Cliente Compute Engine

Un ejemplo en Java-RMI (ii)


Migracin de objetos
Definicin de interfaces (i): el objeto servidor Compute.java
package compute; import java.rmi.Remote; import java.rmi.RemoteException; public interface Compute extends Remote { Object executeTask(Task t) throws RemoteException; }
Hereda de Remote

Devolver resultado

Procesamiento distribuido en Java

Joan Vila

99

Procesamiento distribuido en Java

Joan Vila

100

Un ejemplo en Java-RMI (ii)


Migracin de objetos
Definicin de interfaces (ii): la tarea a migrar Task.java
package compute; import java.io.Serializable; public interface Task extends Serializable { Object execute(); }
Hereda de Serializable

Un ejemplo en Java-RMI (ii)


Migracin de objetos
El objeto servidor (i)
package engine; import java.rmi.*; import java.rmi.server.*; import compute.*; public class ComputeEngine extends UnicastRemoteObject implements Compute { public ComputeEngine() throws RemoteException { super(); } public Object executeTask(Task t) { return t.execute(); }

ComputeEngine.java
a de Hered teObject o tRem s Unica

Implementa Compute

Procesamiento distribuido en Java

Joan Vila

101

Procesamiento distribuido en Java

Joan Vila

102

Un ejemplo en Java-RMI (ii)


Migracin de objetos
El objeto servidor (ii): el mtodo main
... public class ComputeEngine extends UnicastRemoteObject implements Compute { ... alar i nst r ar e anage public static void main(String[] args) { Cre ity M ur if (System.getSecurityManager() == null) { Se c System.setSecurityManager(new RMISecurityManager()); } String name = "//localhost/Compute"; try { Compute engine = new ComputeEngine(); Registrar objeto Naming.rebind(name, engine); en servidor de System.out.println("ComputeEngine bound"); nombres } catch (Exception e) {
Procesamiento distribuido en Java
Joan Vila

Un ejemplo en Java-RMI (ii)


Migracin de objetos
El cliente (i): el mtodo main

ComputeEngine.java

ComputePi.java
package client; import java.rmi.*; import java.math.*; import compute.*;
ar public class ComputePi { stal er e in ear Manag public static void main(String args[]) { Cr ity ur Se c if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } ...

103

Procesamiento distribuido en Java

Joan Vila

104

Un ejemplo en Java-RMI (ii)


Migracin de objetos
El cliente (ii): el mtodo main
package client; ...

Un ejemplo en Java-RMI (ii)


Migracin de objetos
El cliente (ii): la tarea Pi

ComputeEngine.java

Pi.java
package client; import compute.*; import java.math.*; public class Pi implements Task { ... Imp private int digits; le public Pi(int digits) { this.digits = digits; } public Object execute() { return calculatePi(digits); }
Procesamiento distribuido en Java Implementa el mtodo execute
Joan Vila

o public class ComputePi { jet ob de public static void main(String args[]) { ar dor sc vi ... s Bu ser bre try { en nom String name = "//" + args[0] + "/Compute"; Compute comp = (Compute) Naming.lookup(name); Instancia Pi task = new Pi(Integer.parseInt(args[1])); de task BigDecimal pi = (BigDecimal) (comp.executeTask(task)); System.out.println(pi); Invoca } catch (Exception e) { r obje to System.err.println("ComputePi exception: " + e.getMessage()); e.printStackTrace(); } } } Procesamiento distribuido en Java Joan Vila 105

public static BigDecimal calculatePi(int digits) { ... } }

m de T enta ask

106

Diseo Y Aplicaciones de Sistemas Distribuidos

Hello CORBA!

JAVA y CORBA

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia Procesamiento distribuido en Java
Joan Vila

108

La interfaz IDL

Procesamiento de interfaces
El procesador idltojava
Hello.java

Produce los siguientes ficheros: Hello.java


Versin Java de la interfaz IDL. Extiende org.omg.CORBA.Object, proporciona funcionalidad de objeto CORBA estndar. que

Hello.idl module HelloApp { module HelloApp { interface Hello { interface Hello { // Methods // Methods string sayHello(); string sayHello(); }; }; }; };

_HelloImplBase.java idltojava _HelloStub.java HelloHelper.java HelloHolder.java

_HelloImplBase.java
Esqueleto del servidor. Es una clase abstracta que proporciona la funcionalidad CORBA bsica para el servidor. Implementa la interfaz Hello.java. La clase del servidor HelloServant extiende _HelloImplBase.

_HelloStub.java
Stub del cliente. Implementa la interfaz Hello.java.

Procesamiento distribuido en Java

Joan Vila

109

Procesamiento distribuido en Java

Joan Vila

110

Procesamiento de interfaces
El procesador idltojava (ii)
y tambin los siguientes ficheros: HelloHelper.java
Clase final que proporciona funcionalidad extra, fundamentalmente el mtodo narrow para convertir referencias CORBA a su cooresponidentes tipos.

Desarrollo del cliente


Importar los paquetes requeridos
import HelloApp.*; // The package containing our stubs. import org.omg.CosNaming.*; // HelloClient will use the naming service. import org.omg.CORBA.*; // All CORBA applications need these classes. java.awt.Graphics // Only for Applets org.omg.CosNaming.NamingContextPackage.* // Only for Applets

HelloHolder.java
Clase final que contiene una instancia de Hello. Proporciona operaciones para los argumentos out e inout de CORBA que no se ajustan fcilemente a la semntica de Java

Declarar la clase cliente


public class HelloClient { // Add the main method here in the next step. } public class HelloApplet extends java.applet.Applet { // Put the init() method here in the next step. }
Procesamiento distribuido en Java
Joan Vila

Procesamiento distribuido en Java

Joan Vila

111

112

Desarrollo del cliente


Declarar el mtodo main con un bloque para manejo de excepciones CORBA
public static void main(String args[]) { try { // Add the rest of the HelloClient code here. } catch(Exception e) { System.out.println("ERROR : " + e); e.printStackTrace(System.out); } }

Desarrollo del cliente


Encontrar el servidor Obtener el contexto de nombres inicial
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");

Estrechar la referencia al objeto


NamingContext ncRef = NamingContextHelper.narrow(objRef);

Encontrar el servicio a partir de su nombre


NameComponent nc = new NameComponent("Hello", ""); NameComponent path[] = {nc}; Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));

Crear un objeto CORBA


ORB orb = ORB.init(args, null);

Invocar la operacin
String Hello = helloRef.sayHello();

Procesamiento distribuido en Java

Joan Vila

113

Procesamiento distribuido en Java

Joan Vila

114

Desarrollo del cliente


Ficheros del cliente HelloClient.java HelloApplet.html (slo para Applet)

Desarrollo del servidor


Importar los paquetes requeridos
import HelloApp.*; // The package containing our stubs. import org.omg.CosNaming.*; // HelloServer will use the naming service. import org.omg.CosNaming.NamingContextPackage.*; // The package containing // special exceptions thrown by the name service. import org.omg.CORBA.*; // All CORBA applications need these classes.

Declarar la clase servidor


public class HelloServer { // Add the main method here in the next step. }

Procesamiento distribuido en Java

Joan Vila

115

Procesamiento distribuido en Java

Joan Vila

116

Desarrollo del servidor


Declarar el mtodo main con un bloque para manejo de excepciones CORBA
public static void main(String args[]) { try {

Desarrollo del servidor


Registrarse en el servidor de nombres Obtener el contexto de nombres inicial
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");

// Add the rest of the HelloServer code here.


} catch(Exception e) { System.out.println("ERROR : " + e); e.printStackTrace(System.out); } }

Estrechar la referencia al objeto


NamingContext ncRef = NamingContextHelper.narrow(objRef);

Registrar el sirviente en el servidor de nombres


NameComponent nc = new NameComponent("Hello", ""); NameComponent path[] = {nc}; ncRef.rebind(path, helloRef);

Crear un objeto CORBA


ORB orb = ORB.init(args, null);

Instanciar el objeto sirviente


HelloServant helloRef = new HelloServant();
Procesamiento distribuido en Java orb.connect(helloRef);
Joan Vila

117

Procesamiento distribuido en Java

Joan Vila

118

Desarrollo del servidor


Esperar invocaciones
java.lang.Object sync = new java.lang.Object(); synchronized(sync) { sync.wait();

Compilando ...
Compile HelloClient.java:
javac HelloClient.java HelloApp\*.java

Compile HelloServer.java:
javac HelloServer.java HelloApp\*.java

Declarar la clase sirviente


class HelloServant extends _HelloImplBase { public String sayHello() { return "\nHello World!!\n"; } }

Ficheros:

HelloServer.java
Procesamiento distribuido en Java
Joan Vila

119

Procesamiento distribuido en Java

Joan Vila

120

... y ejecutando
From an MS-DOS system prompt (Windows) or command shell (UNIX), start the Java IDL name server: tnameserv -ORBInitialPort 1050 From a second system prompt or shell, start the Hello server: java HelloServer -ORBInitialPort 1050 From a third prompt or shell, run the Hello application client: java HelloClient -ORBInitialPort 1050 The client prints the string from the server to the command line: Hello world!!

Diseo Y Aplicaciones de Sistemas Distribuidos

Applets

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia Procesamiento distribuido en Java
Joan Vila

121

Applets
Qu es un Applet ?
xaloc.es
Cliente WWW Servidor WWW

Applets
Applets
Son subclases de la clase Applet Son objetos grficos (subclases de Component) que se pueden ejecutar en el entorno de un browser de red (siempre que este incluya la mquina virtual). El sistema grfico AWT es representable por el browser de red. Se lanzan desde un fichero en HTML: sto hace migrar el cdigo del URL remoto al browser de red. Tienen algunas limitaciones de seguridad en el acceso a ficheros y recursos de la mquina a la que migran.
123 Procesamiento distribuido en Java
Joan Vila

N
http://xaloc.es/echo.html

referencia echo. html migran Servidor echo echoClient. class

echoClient. class

Mquina virtual java

Procesamiento distribuido en Java

Joan Vila

124

Applets
Ciclo de vida de un Applet: milestones
public class Simple extends Applet {{ public class Simple extends Applet StringBuffer buffer; StringBuffer buffer; public void init() {{ public void init() buffer = new StringBuffer(); buffer = new StringBuffer(); addItem("initializing... "); addItem("initializing... "); }} public void start() {{ public void start() addItem("starting... "); addItem("starting... "); }} public void stop() {{ public void stop() addItem("stopping... ") addItem("stopping... ") }} public void destroy() {{ public void destroy() addItem("prepar. for unloading..."); addItem("prepar. for unloading..."); }} Procesamiento distribuido en Java

Applets
Mtodos para dibujo y manejo de eventos
Se utilizan as mismas clases y mtodos que en AWT Dibujo: sobrecargar el mtodo paint de la clase Component o los propios de cada componente. Manejo de eventos: utilizar las interfaces y clases del paquete java.awt.event
void addItem(String newWord) {{ void addItem(String newWord) System.out.println(newWord); System.out.println(newWord); buffer.append(newWord); buffer.append(newWord); repaint(); repaint(); }} public void paint(Graphics g) {{ public void paint(Graphics g)
//Draw aaRectangle //Draw Rectangle // around the applet's display area // around the applet's display area

g.drawRect(0, 0, size().width --1, g.drawRect(0, 0, size().width 1, size().height --1); size().height 1); }} }}

g.drawString(buffer.toString(), 5, 15); g.drawString(buffer.toString(), 5, 15);

//Draw the current string inside the rectangle. //Draw the current string inside the rectangle.

Joan Vila

125

Procesamiento distribuido en Java

Joan Vila

126

Applets
La etiqueta APPLET en HTML
<HTML> <HTML> <HEAD> <HEAD> <!-- Generated by Kawa IDE --> <!-- Generated by Kawa IDE --> <TITLE>Echo Applet</TITLE> <TITLE>Echo Applet</TITLE> </HEAD> </HEAD> <BODY> <BODY> <H1>Hello World</H1> <H1>Hello World</H1> <HR> <HR> <APPLET CODEBASE="../.." <APPLET CODEBASE="../.." CODE="examples.echo.EchoApplet" CODE="examples.echo.EchoApplet" WIDTH=300 HEIGHT=300> WIDTH=300 HEIGHT=300> <PARAM NAME = maquina VALUE="localhost"> <PARAM NAME = maquina VALUE="localhost"> </APPLET> </APPLET> <HR> <HR> </BODY> </BODY> </HTML> </HTML>
Procesamiento distribuido en Java
Joan Vila

Applets
Hello.htm

El Applet echo
package examples.eco; package examples.eco; import java.awt.*; import java.awt.*; import java.rmi.*; import java.rmi.*;

EchoApplet.java

127

public class EchoApplet extends java.applet.Applet public class EchoApplet extends java.applet.Applet {{ String message = Beep, Beep. Funciona el eco "; String message = Beep, Beep. Funciona el eco "; public void init() public void init() {{ try {{ try String maquina = null; String maquina = null; maquina = getParameter("maquina"); maquina = getParameter("maquina"); EchoIntRMI obj = (EchoIntRMI) Naming.lookup("//"+maquina+ "/EchoObject"); EchoIntRMI obj = (EchoIntRMI) Naming.lookup("//"+maquina+ "/EchoObject"); message = obj.echo(); message = obj.echo(); }}catch (Exception e) {{ catch (Exception e) System.out.println(EchoApplet exception: ""+ System.out.println(EchoApplet exception: + e.getMessage()); e.getMessage()); }} }} Procesamiento distribuido en Java Joan Vila 128

Applets
El Applet echo
EchoApplet.java
package examples.eco; package examples.eco; public class EchoApplet extends java.applet.Applet public class EchoApplet extends java.applet.Applet ... ... public void paint(Graphics g) public void paint(Graphics g) {{ g.drawString(message, 25, 50); g.drawString(message, 25, 50); }} }}

Applets
Restricciones de seguridad
La mayoria de los visores imponen restricciones de ejecucin sobre Applets no confiables. Provocan SecurityException s. Las restricciones son: No puede cargar bibliotecas (excepto java.*) y mtodos nativos. No puede leer o escribir ficheros sobre el host que ejecuta el Applet. No puede establecer conexiones de red excepto al host del que proviene. No puede ejecutar un programa en el host que ejecuta el Applet. No puede obtener demasiadas propiedades del sistema Las ventanas de los applets traen son de apariencia diferente a las ventanas del sistema (directorio de trabajo, directorio de usuario, nombre usuario,..) La forma de declarar un Applet confiable es dependiente del visor (a travs de firmas o URLs vlidos, ...)

Procesamiento distribuido en Java

Joan Vila

129

Procesamiento distribuido en Java

Joan Vila

130

Diseo Y Aplicaciones de Sistemas Distribuidos

Servlets
Qu es un servlet?
Son una forma de realizar CGIs en Java (server side programming) Tiene capacidades para manipular peticiones y respuesta a formularios HTML No tienen una interfaz grfica (a diferencia de los Applets)

Servlets

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia Procesamiento distribuido en Java
Joan Vila

132

Servlets
Arquitectura javax.Servlet del paquete

Servlets
Arquitectura del paquete javax.Servlet
La clase ServletRequest proporciona:
Acceso a las variables CGI y a los parmetros definidos por la peticin del cliente. Acceso al input stream ServletInputStream, a travs del cual el servlet obtiene datos de clientes que utilizan protocolos de aplicacin tales como los mtodos POST y PUT de HTTP u otros ms especficos.

Las interfaces Servlet y HttpServlet proporcionan mtodos para gestionar el Servlet y manejar las comunicaciones con los clientes. Cuando un servlet acepta una peticin de un cliente recibe dos objetos
ServletRequest: encapsula comunicacin del cliente al servlet ServletResponse: encapsula comunicacin del servlet al cliente la la

La clase ServletResponse proporciona mtodos para:


Contestar al cliente con un PrintWriter, estableciendo las variables CONTENT_LENGTH y CONTENT_TYPE. Contestar al client a travs de un ServletOutputStream.

Procesamiento distribuido en Java

Joan Vila

133

Procesamiento distribuido en Java

Joan Vila

134

Servlets
Un ejemplo de servlet
public BookServlet extends HttpServlet { public BookServlet extends HttpServlet { doGet(HttpServletRequest request, HttpServletResponse response) doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException throws ServletException, IOException { ... { ... // set content-type header before accessing the Writer // set content-type header before accessing the Writer response.setContentType("text/html"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter(); // then write the response // then write the response out.println("<html>" + "<head><title>Book Description</title></head>" + ...); out.println("<html>" + "<head><title>Book Description</title></head>" + ...); //Get the identifier of the book to display //Get the identifier of the book to display String bookId = request.getParameter("bookId"); String bookId = request.getParameter("bookId"); if (bookId != null) { if (bookId != null) { // and the information about the book and print it // and the information about the book and print it ... ... } } out.println("</body></html>"); out.println("</body></html>"); out.close(); out.close();
Joan Vila

Servlets
Manejo de mtodos GET y POST Sobrecargar los mtodos doGet y doPost de HttpServlet Aspectos de multithreading Los servlets atienden clientes concurrentemente. Para atenderlos secuencialmente:
public class BookServlet extends HttpServlet implements SingleThreadModel

Ciclo de vida de un servlet Algunos mtodos de la clase HttpServlet son invocados automticamente a lo largo de su ciclo de vida:
init: cuando un servlet es cargado por el servidor. Se puede sobrecargar. destroy: cuando un servlet es descargado por el servidor. Se puede sobrecargar. service: cada vez que se procesa una peticin de un cliente. Slo se suele sobrecargar para poner un contador de clientes.

} } Procesamiento distribuido en Java

135

Procesamiento distribuido en Java

Joan Vila

136

Servlets
Ejemplo de cmo sobrecargar el mtodo service
public ShutdownExample extends HttpServlet { public ShutdownExample extends HttpServlet { private int serviceCounter = 0; private int serviceCounter = 0; //Access methods for serviceCounter //Access methods for serviceCounter protected synchronized void enteringServiceMethod() protected synchronized void enteringServiceMethod() { serviceCounter++; } { serviceCounter++; } protected synchronized void leavingServiceMethod() { serviceCounter--; } protected synchronized void leavingServiceMethod() { serviceCounter--; } protected synchronized int numServices() { return serviceCounter;} protected synchronized int numServices() { return serviceCounter;} } } protected void service(HttpServletRequest req, HttpServletResponse resp) protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException throws ServletException, IOException { { enteringServiceMethod(); enteringServiceMethod(); try { try { super.service(req, resp); super.service(req, resp); } finally { } finally { leavingServiceMethod(); leavingServiceMethod(); } } } } Procesamiento distribuido en Java

Servlets
Informacin de estado
Existen dos opciones bsicas Sessions: mantenida por el servidor Cookies: mantenida por el cliente

Sessions
Sirven para establecer sesiones con un cliente web. Permiten;
Crear una sesin. Almacenar/Obtener datos Invalidar una sesin.

Cookies
Permiten a un servidor enviar informacin codificada a un cliente para recuperarla ms tarde sin alterar.

Joan Vila

137

Procesamiento distribuido en Java

Joan Vila

138

Servlets
Sessions
public class CatalogServlet extends HttpServlet {{ public class CatalogServlet extends HttpServlet public void doGet (HttpServletRequest request, HttpServletResponse response) public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {{ throws ServletException, IOException // Get the user's session and shopping cart // Get the user's session and shopping cart HttpSession session = request.getSession(true); HttpSession session = request.getSession(true); ShoppingCart cart = ShoppingCart cart = (ShoppingCart) session.getValue(session.getId()); (ShoppingCart) session.getValue(session.getId()); // If the user has no cart, create aanew one // If the user has no cart, create new one if (cart == null) {{ if (cart == null) cart = new ShoppingCart(); cart = new ShoppingCart(); }} session.putValue(session.getId(), cart); session.putValue(session.getId(), cart); ... ...
Joan Vila

Servlets
Sessions
public void doGet (HttpServletRequest request, HttpServletResponse response) public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {{ throws ServletException, IOException HttpSession session = request.getSession(true); HttpSession session = request.getSession(true); ShoppingCart cart = (ShoppingCart)session.getValue(session.getId()); ShoppingCart cart = (ShoppingCart)session.getValue(session.getId()); ... ... // Check for pending adds to the shopping cart // Check for pending adds to the shopping cart String bookId = request.getParameter("Buy"); String bookId = request.getParameter("Buy"); //If the user wants to add aabook, add it and print the result //If the user wants to add book, add it and print the result String bookToAdd = request.getParameter("Buy"); String bookToAdd = request.getParameter("Buy"); if (bookToAdd != null) {{ if (bookToAdd != null) BookDetails book = database.getBookDetails(bookToAdd); BookDetails book = database.getBookDetails(bookToAdd);
Aadir Informacin estado

Obtener el id de una sesin Obtener estado de una sesin

Asociar un nuevo estado a una sesin

cart.add(bookToAdd, book); cart.add(bookToAdd, book); out.println("<p><h3>" + ...); out.println("<p><h3>" + ...);


Joan Vila

}} Procesamiento distribuido en Java

}}

139

}} }} Procesamiento distribuido en Java

140

Servlets
Sessions
public class ReceiptServlet extends HttpServlet {{ public class ReceiptServlet extends HttpServlet public void doPost(HttpServletRequest request, HttpServletResponse response) public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {{ throws ServletException, IOException ... ... scart = (ShoppingCart)session.getValue(session.getId()); scart = (ShoppingCart)session.getValue(session.getId()); ... ... // Clear out shopping cart by invalidating the session // Clear out shopping cart by invalidating the session session.invalidate(); session.invalidate(); // set content type header before accessing the Writer // set content type header before accessing the Writer response.setContentType("text/html"); response.setContentType("text/html"); out = response.getWriter(); out = response.getWriter(); ... ... }} }} Procesamiento distribuido en Java
Joan Vila

Servlets
Cookies
Crear un cookie (un cookie asociado a cada libro):
Cookie getBook = new Cookie(Buy, bookId)

Enviar un cookie:
response.addCookie(getBook);

Establecer atributos de un cookie:


Comentarios: getBook.setComment( El cliente ...) Tiempo validez: getBook.setMaxAge(0) // 0 Lo borra

Invalidar sesin

Recuperar cookies:
Cookie[] cookies = request.getCookies();

Consultar valor de un cookie:


getBook.getValue().equals(bookId)

141

Procesamiento distribuido en Java

Joan Vila

142

Diseo Y Aplicaciones de Sistemas Distribuidos

Seguridad en Java
Modelo de seguridad de la plataforma JDK 1.0

Seguridad en Java

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia Procesamiento distribuido en Java
Joan Vila

144

Seguridad en Java
Modelo de seguridad de la plataforma JDK 1.1

Seguridad en Java
Modelo de seguridad de la plataforma JDK 1.2

Procesamiento distribuido en Java

Joan Vila

145

Procesamiento distribuido en Java

Joan Vila

146

Seguridad en Java
Modelo de seguridad de la plataforma JDK 1.2
Todo el cdigo (independientemente de si es local o remoto) est sujeto a una poltica de seguridad. Una poltica de seguridad define un conjunto de permisos diponibles para cdigo segn sea:
Su URL de origen Su firma

Seguridad en Java
Modelo de seguridad de la plataforma JDK 1.2
Se pueden aadir nuevas polticas de seguridad:
Mediante parmetros para la mquina virtual: $ java -Djava.security.policy=C:/ajava.policy Mediante una nueva entrada en /jre/lib/security/java.security policy.url.1=file:${java.home}/lib/security/java.policy policy.url.2=file:${user.home}/.java.policy policy.url.3=file:C:/ajava.policy

El soporte de ejecucin organiza el cdigo en dominios cada uno de los cuales agrupa una serie de clases cuyas instancias son concedidas dichos permisos. Los permisos por defecto son equivalentes a los de la plataforma 1.1 y se definen en el fichero: ... /jre/lib/security/java.policy

Ejemplo de fichero java.policy con permisos de seguridad:


grant codeBase jar:http://www.xxx.yyy/jarfile.jar!/ { permission java.net.SocketPermission localhost:1024-65535", "connect,accept"; permission java.io.FilePermission "d:\\java\\codebase\\-", "read"; };

Procesamiento distribuido en Java

Joan Vila

147

Procesamiento distribuido en Java

Joan Vila

148

Seguridad en Java
Clases Java para seguridad
java.lang.SecurityManager: permite desarrollar implementan una determinada poltica de seguridad. java.security: aplicaciones que

Seguridad en Java
Aplicaciones Java para seguridad
Son herramientas escritas en Java para controlar la seguridad. policytool: permite crear y modificar los ficheros que definen las polticas de una determinada aplicacin. keytool: permite crear pares de claves pblicas y privadas, importar y visualizar cadenas de certificados, exportar certificados, generar certificados autofirmados X.509v1, generar peticiones para ser enviadas a autoridades de certificacin. jarsigner: permite firmar ficheros JAR y verificar la autenticidad de la firma.

Define clases relacionadas con permisos y polticas Proporciona soporte para firmas digitales, incluyendo implementaciones de:
Algoritmos de resumen MD5 (RFC1321) y SHA-1 Certificados en diversos formatos. En particular soporta certificados X.509 Factora de certificados: utilizada para generar certificados y listas de revocacin de certificados.

Extensiones Java para seguridad


El JCE (Java Criptography Extensions) ampla el JDK con clases para algoritmos de cifrado, intercambio de claves y autentificacin de mensajes.
KeyStore: proporciona interfaces bien definidas para accesder la informacin de un almacen de firmas. Interfaces a especificacin de claves, ....
Procesamiento distribuido en Java
Joan Vila

149

Procesamiento distribuido en Java

Joan Vila

150

Aplicaciones Java para seguridad


Herramienta policytool

Aplicaciones Java para seguridad


Herramienta policytool

Procesamiento distribuido en Java

Joan Vila

151

Procesamiento distribuido en Java

Joan Vila

152

Aplicaciones Java para seguridad


Herramienta policytool

Ficheros JAR
Caractersticas archivos JAR
Los archivos JAR permiten empaquetar en un nico fichero las aplicaciones Java: ficheros .class y recursos auxiliares. Se utiliza tpicamente para applets. Seguridad: se pueden firmar digitalmente. Los receptores puede otorgar privilegios de ejecucin si reconocen la firma. Compresin: permite ahorrar espacio. Mejora tiempo de descarga: slo requieren una interccin HTTP. Empaquetamiento de extensiones: las extensiones son una forma de ampliar la funcionalidad de la plataforma Java. Por ej. Java-3D, Java-Mail Sellado de paquetes: se obliga a las aplicaciones a utilizar las clases definidas en el paquete (asegurar consistencia de versiones). Meta-informacin: incorporan un fichero de manifiesto en el que, ademas de la informacin sobre ficheros contenidos, figura informacin sobre vendedor, versin, etc. Portabilidad: el mecanismo JAR es estndar de la plataforma Java.

Procesamiento distribuido en Java

Joan Vila

153

Procesamiento distribuido en Java

Joan Vila

154

Ficheros JAR
Manejo de ficheros JAR
To create a JAR file To view the contents of a JAR file To extract the contents of a JAR file To extract specific files from a JAR file To run an application packaged as a JAR file (version 1.1) To run an application packaged as a JAR file (version 1.2 -- requires manifest header) To invoke an applet packaged as a JAR file jar cf jar-file input-file(s) jar tf jar-file jar xf jar-file jar xf jar-file archived-file(s) jre -cp app.jar MainClass java -jar app.jar <applet code=AppletClassName.class archive="JarFileName.jar" width=width height=height> </applet>

Intercambio de JAR firmados


Pasos a seguir por el que genera el JAR

Procesamiento distribuido en Java

Joan Vila

155

Procesamiento distribuido en Java

Joan Vila

156

Intercambio de JAR firmados


Pasos a seguir por el que genera el JAR
1.- Crear un fichero JAR que contenga un contrato con jar
jar cvf Contract.jar contract
Contract es un fichero ASCII con los trminos del contrato legal.

Intercambio de JAR firmados


Opciones de jarsigner
-keystore url -storepass password -keypass password Specifies a keystore to be used if you don't want to use the.keystore default database. Allows you to enter the keystore's password on the command line rather than be prompted for it. Allows you to enter your alias's password on the command line rather than be prompted for it. Specifies the base name for the .SF and .DSA files if you don't want the base name to be taken from your alias. file must be composed only of upper case letters (A-Z), numerals (0-9), hyphen (-), and underscore (_). Specifies the name of the signed JAR file to be generated if you don't want the original unsigned file to be overwritten with the signed file.
Joan Vila

2.- Generar las claves con keytool


keytool genkey alias signLegal keystore stanstore
Pregunta la id. del firmante, la clave privada y un passwd para el almacen de claves Genera un certificado signLegal autofirmado con la identidad y un par de claves pblica/privada Almacena almacn de claves stanstore con un passwd

3.- Firmar el fichero jar con jarsigner


jarsigner keystore stanstore signedjar sContract.jar Contract.jar signLegal

-sigfile file

4.- Exportar el certificado con la clave pblica con keytool


keytool -export -keystore stanstore -alias signLegal -file StanSmith.cer
Genera (desde stanstore)un certificado con la clave pblica para envirlo al receptor Procesamiento distribuido en Java Joan Vila 157 -signedjar file

Procesamiento distribuido en Java

158

Intercambio de JAR firmados


Formato de un JAR firmado
Cuando se genera un JAR firmado: Cada fichero del archivo se le da una entrada resumen (digest) en el fichero de manifiesto: META-INF/MANIFEST.MF
Name: test/classes/ClassOne.class SHA1-Digest: TD1GZt8G11dXY2p4olSZPc5Rj64=

Intercambio de JAR firmados


Pasos a seguir por el que recibe el JAR

Se genera un fichero de firma: META-INF/fichero.SF


Signature-Version: 1.0 SHA1-Digest-Manifest: h1yS+K9T7DyHtZrtI+LxvgqaMYM= Created-By: SignatureFile JDK 1.2 Name: test/classes/ClassOne.class SHA1-Digest: fcav7ShIG6i86xPepmitOVo4vWY= Name: test/classes/ClassTwo.class SHA1-Digest: xrQem9snnPhLySDiZyclMlsFdtM=

Adicionalmente, se genera un fichero de bloque de firma con la firma digital del JAR creada con la clave privada y el certificado con la clave pblica.
Procesamiento distribuido en Java
Joan Vila

159

Procesamiento distribuido en Java

Joan Vila

160

Intercambio de JAR firmados


Pasos a seguir por el que recibe el JAR
1.- Importar el certificado y declararlo confiable utilizando keytool
keytool -import -alias stan -file StanSmith.cer -keystore ruthstore keytool -printcert -file StanSmith.cer

Diseo Y Aplicaciones de Sistemas Distribuidos

2.- Verificar la firma del JAR utilizando jarsigner


jarsigner -verify -verbose -keystore ruthstore sContract.jar
183 Fri Jul 31 10:49:54 PDT 1998 META-INF/SIGNLEGAL.SF 1542 Fri Jul 31 10:49:54 PDT 1998 META-INF/SIGNLEGAL.DSA 0 Fri Jul 31 10:49:18 PDT 1998 META-INF/ smk 1147 Wed Jul 29 16:06:12 PDT 1998 contract s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore i = at least one certificate was found in identity scope jar verified. Procesamiento distribuido en Java
Joan Vila

Gestores de seguridad en Java

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia 161

Gestores de seguridad
Gestores de seguridad
Son subclases de Security Manager Sobrecargan mtodos checkXXX que son invocados por las bibliotecas Java antes de realizar operaciones potencialmente peligrosas.
class ASecurityManager extends SecurityManager {{ class ASecurityManager extends SecurityManager public void checkRead(String filename) {{ public void checkRead(String filename) if (!accessOK()) throw new SecurityException("No Way!"); if (!accessOK()) throw new SecurityException("No Way!"); }} public void checkRead(String filename, Object executionContext) {...} public void checkRead(String filename, Object executionContext) {...} public void checkWrite(FileDescriptor filedescriptor) {...} public void checkWrite(FileDescriptor filedescriptor) {...} }} public void checkWrite(String filename) {...} public void checkWrite(String filename) {...}
Joan Vila

Gestores de seguridad
Gestores de seguridad
These methods are called by various methods in the Java libraries before those methods perform certain potentially sensitive operations. The invocation of such a check method typically looks like this:
SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkXXX(argument, . . . ); }

The security manager is thereby given an opportunity to prevent completion of the operation by throwing an exception. The special method checkPermission(java.security.Permission) determines whether an access request indicated by a specified permission should be granted or denied.

Procesamiento distribuido en Java

163

Procesamiento distribuido en Java

Joan Vila

164

Gestores de seguridad
Gestores de seguridad
checkConnect public void checkConnect(String host, int port)
Throws a SecurityException if the calling thread is not allowed to open a socket connection to the specified host and port number. A port number of -1 indicates that the calling method is attempting to determine the IP address of the specified host name. This method calls checkPermission with the:
SocketPermission(host+":"+port,"connect") permission (port != -1) SocketPermission(host,"resolve") permission (port = -1)

Gestores de seguridad
RMISecurityManager
Provides an example security manager for use by RMI applications that use downloaded code. RMI's class loader will not download any classes from remote locations if no security manager has been set. RMISecurityManager does not apply to applets, which run under the protection of their browser's security manager.

If you override this method, then you should make a call to super.checkConnect at the point the overridden method would normally throw an exception.

Procesamiento distribuido en Java

Joan Vila

165

Procesamiento distribuido en Java

Joan Vila

166

Gestores de seguridad
Un ejemplo de gestor de seguridad
Acceso a ficheros con contrasea

Gestores de seguridad
Un ejemplo de gestor de seguridad
Acceso a ficheros con contrasea
class PasswordSecurityManager extends SecurityManager {{ class PasswordSecurityManager extends SecurityManager . .. .. . private boolean accessOK() {{ private boolean accessOK() int c; int c; DataInputStream dis = new DataInputStream(System.in); DataInputStream dis = new DataInputStream(System.in); String response; String response; System.out.println(" Password?"); System.out.println(" Password?"); try {{ try response = dis.readLine(); response = dis.readLine(); if (response.equals(password)) return true; if (response.equals(password)) return true; else return false; else return false; }}catch (IOException e) {{ return false; }} catch (IOException e) return false; }} . SIGUE! . SIGUE!
Joan Vila

class PasswordSecurityManager extends SecurityManager {{ class PasswordSecurityManager extends SecurityManager . .. .. . PasswordSecurityManager(String password) {{ PasswordSecurityManager(String password) super(); super(); this.password = password; this.password = password; }} . SIGUE! . SIGUE!

Procesamiento distribuido en Java

167

Procesamiento distribuido en Java

Joan Vila

168

Gestores de seguridad
Un ejemplo de gestor de seguridad
Acceso a ficheros con contrasea
public void checkRead(String filename) {{ public void checkRead(String filename) if (!accessOK()) throw new SecurityException("No Way!"); if (!accessOK()) throw new SecurityException("No Way!"); }} public void checkRead(String filename, Object executionContext) {{ public void checkRead(String filename, Object executionContext) if (!accessOK()) throw new SecurityException("Forget It!"); if (!accessOK()) throw new SecurityException("Forget It!"); }} public void checkWrite(FileDescriptor filedescriptor) {{ public void checkWrite(FileDescriptor filedescriptor) if (!accessOK()) throw new SecurityException("Not!"); if (!accessOK()) throw new SecurityException("Not!"); }} public void checkWrite(String filename) {{ public void checkWrite(String filename) if (!accessOK()) throw new SecurityException("Not Even!"); if (!accessOK()) throw new SecurityException("Not Even!"); }} }}
Procesamiento distribuido en Java
Joan Vila

Gestores de seguridad
Un ejemplo de gestor de seguridad
Acceso a ficheros con contrasea Instalacin

try {{ try System.setSecurityManager(new PasswordSecurityManager("Booga Booga")); System.setSecurityManager(new PasswordSecurityManager("Booga Booga")); }}catch (SecurityException se) {{ catch (SecurityException se) System.out.println("SecurityManager already set!"); System.out.println("SecurityManager already set!"); }}

169

Procesamiento distribuido en Java

Joan Vila

170

Gestores de seguridad
Gestores de seguridad:
qu mtodos sobrecargar?
sockets checkAccept(String host, int port) sockets checkAccept(String host, int port) checkConnect(String host, int port) checkConnect(String host, int port) checkConnect(String host, int port, Object executionContext) checkConnect(String host, int port, Object executionContext) checkListen(int port) checkListen(int port) threads threads checkAccess(Thread thread) checkAccess(Thread thread) checkAccess(ThreadGroup threadgroup) checkAccess(ThreadGroup threadgroup)

Gestores de seguridad
Gestores de seguridad
qu mtodos sobrecargar?
system commands checkExec(String command) system commands checkExec(String command) interpreter checkExit(int status) interpreter checkExit(int status) package checkPackageAccess(String packageName) package checkPackageAccess(String packageName) checkPackageDefinition(String packageName) checkPackageDefinition(String packageName) properties checkPropertiesAccess() properties checkPropertiesAccess() checkPropertyAccess(String key) checkPropertyAccess(String key) checkPropertyAccess(String key, String def) checkPropertyAccess(String key, String def) networking checkSetFactory() networking checkSetFactory() windows checkTopLevelWindow(Object window) windows checkTopLevelWindow(Object window)
171 Procesamiento distribuido en Java
Joan Vila

class loader checkCreateClassLoader() class loader checkCreateClassLoader() file system checkDelete(String filename) file system checkDelete(String filename) checkLink(String library) checkLink(String library) checkRead(FileDescriptor filedescriptor) checkRead(FileDescriptor filedescriptor) checkRead(String filename) checkRead(String filename) checkRead(String filename, Object executionContext) checkRead(String filename, Object executionContext) checkWrite(FileDescriptor filedescriptor) checkWrite(FileDescriptor filedescriptor) checkWrite(String filename) checkWrite(String filename) Procesamiento distribuido en Java Joan Vila

172

Diseo Y Aplicaciones de Sistemas Distribuidos

URLs
Qu es un URL? Universal Resource Locator.

URLs en Java

Proporciona informacin de la ubicacin de un recurso en Internet. Tiene 3 partes: Protocolo utilizado para acceder la informacin
ftp://javasoft.com/docs http://sop.upv.es/so/srd/transparencias.html file:/home/jvila/docs/tutorial.html

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia

Informacin del host. Puede incluir, adems del nombre del host, el port, el login y el password.
http://sop.upv.es http://sop.upv.es:80/so/srd/index.html http://sop.upv.es.jvila.hola123/so/srd/index.html
Procesamiento distribuido en Java

Ruta de acceso

Joan Vila

174

URLs
Clases y mtodos para trabajo con URLs Clase URL Permite abrir conexiones y lecturas directas.
URL() : constructor getHost(), getFile(), : analizadores de URL openConnection() : Abre una conexin a un URL y retorna un URLConnection openStream() : Abre una conexin al URL y retorna un InputStream para lectura

URLs
Clases y mtodos para trabajo con URLs Clase URLConnection Permite lecturas y escrituras y una forma de operacin mas general con URLs
URLConnection() : constructor getInputStream() : retorna un InputStream para lectura getOutputStream() : retorna un ouputStream para escritura

Procesamiento distribuido en Java

Joan Vila

175

Procesamiento distribuido en Java

Joan Vila

176

URLs
import java.net.*; import java.io.*;

URLs
Lectura directa de un URL
import java.net.*; import java.io.*; class OpenStreamTest { public static void main(String[] args) { try { URL yahoo = new URL("http://www.yahoo.com/"); BufferedReader dis = new BufferedReader new InputStreamReader(yahoo.openStream())); String inputLine; while ((inputLine = dis.readLine()) != null) { System.out.println(inputLine); } dis.close();

Constructor y analizadores de URL

Procesamiento distribuido en Java

class ParseURL { public static void main(String[] args) { URL aURL = null; try { aURL = new URL( "http://java.sun.com:80/tutorial/intro.html#DOWNLOADING"); System.out.println("protocol = " + aURL.getProtocol()); System.out.println("host = " + aURL.getHost()); System.out.println("filename = " + aURL.getFile()); System.out.println("port = " + aURL.getPort()); System.out.println("ref = " + aURL.getRef()); } catch (MalformedURLException e) { System.out.println("MalformedURLException: " + e); } } }
Joan Vila

177

Procesamiento distribuido en Java

Joan Vila

178

URLs
Lectura directa de un URL
import java.net.*; import java.io.*; class OpenStreamTest { public static void main(String[] args) { try { ... } dis.close(); } catch (MalformedURLException me) { System.out.println("MalformedURLException: " + me); } catch (IOException ioe) { System.out.println("IOException: " + ioe); } } }
Procesamiento distribuido en Java
Joan Vila

URLs
Conexin a un URL
import java.net.*; import java.io.*; class ConnectionTest { public static void main(String[] args) { try { URL yahoo = new URL("http://www.yahoo.com/"); URLConnection yahooConnection = yahoo.openConnection(); BufferedReader is = new BufferedReader( new InputStreamReader(yahooConnection.getInputStream())); PrintWriter os = new PrintWriter( new IbufferedOutputStream(yahooConnection.getOutputStream())); String inputLine; } dis.close(); } catch (MalformedURLException me) { System.out.println("MalformedURLException: " + me); } catch (IOException ioe) { System.out.println("IOException: " + ioe); } 179 } Procesamiento distribuido en Java }
Joan Vila

180

Diseo Y Aplicaciones de Sistemas Distribuidos

JDBC
Qu es JDBCTM?
NO es el acrnimo de Java DataBase Conectivity (aunque lo parezca) Es un API para ejecutar sentencias SQL desde Java: permite enviar sentencias SQL a cualquier base de datos relacional (no importa que sea Oracle, Informix, ) en cualquier plataforma, aunque sea remota. Ejemplo de qu se puede hacer: pgina de web con una applet que utiliza informacin sobre una base de datos remota.

JDBC

Qu hace JDBC? Bsicamente tres cosas:

Joan Vila
DISCA / UPV Departament dInformtica de Sistemes i Computadors Universitat Politcnica de Valncia

1.- Establecer una conexin con una base de datos 2.- Enviar sentencias SQL 3.- Procesar los resultados.
Procesamiento distribuido en Java
Joan Vila

182

JDBC
JDBC: un ejemplo
Connection con = DriverManager.getConnection (( Connection con = DriverManager.getConnection "jdbc:odbc:wombat", "login", "password"); "jdbc:odbc:wombat", "login", "password"); Statement stmt = con.createStatement(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, ccFROM Table1"); ResultSet rs = stmt.executeQuery("SELECT a, b, FROM Table1"); while (rs.next()) {{ while (rs.next()) int xx= getInt("a"); int = getInt("a"); String ss= getString("b"); String = getString("b"); float ff= getFloat("c"); float = getFloat("c"); }}
Establecimiento de la conexin

JDBC
Qu queda por hacer?
JDBC es un API de muy bajo nivel el que se tienen que invocar directamente sentencias SQL con execute. Por llo, se encuentra en desarrollo: SQL empotrado para Java Mapeo directo de tablas de base de datos relacional a clases Java

Envio sentencia SQL Procesamiento de resultados

JDBC versus ODBC


ODBC de Microsoft es el API ms extendido para acceder bases de datos relacionales que uitliza un interfaz en C. JDBC est construido sobre ODBC. El puente JDBC-ODBC proporciona un interfaz Java a las abstracciones y conceptos de SQL. Tanto ODBC como JDBC estn basados en X/open SQL CLI (Call Level Interface).
Procesamiento distribuido en Java
Joan Vila

Procesamiento distribuido en Java

Joan Vila

183

184

JDBC
Drivers para JDBC
Aplicacin Java JDBC driver manager
Driver de red JDBC Driver del puente JDBC-ODBC Driver ODBC

JDBC
EL JDK componentes: incluye tres

URLs de JDBC
Proporcioana una base de datos de manera que se seleccione el driver adecuado y se establezca una conexin con l. Un URL para JDBC consta de tres partes: jdbc:<subprotocolo>:<subnombre>
jdbc es el protocolo. Siempre es jdbc <subprotocolo> es normalmente el driver o el mecnismos de conectividad que puede ser soportado por uno o ms drivers. Un caso especial es odbc que permite especificar fuentes de datos al estilo odbc y tiene la caracterstica de poder especificar atributos. La sintaxis odbc es:

API JDBC

Driver A

Driver B

Drivers JDBC

Protocolo Protocolos propietarios de Independiente acceso a base de datos de DBMS

Procesamiento distribuido en Java

JDBC driver manager: conecta aplicaciones Java al driver correcto de JDBC: puede seleccionar entre varios tipos de driver: Puente JDBC-ODBC Driver especfico de DBMS Protocolo de red independiente de DMS JDBC test suite: comprueba si un driver cumple con los requisitos JDBC JDBC-ODBC bridge: Permite drivers ODBC ser utilizados como JDBC Joan Vila 185

jdbc:odbc:<data-source-name>[;<nombre-atributo>=<valor atributo>]*
Ejemplos: jdbc:odbc:wombat jdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWER
Procesamiento distribuido en Java
Joan Vila

186

JDBC
URLs de JDBC
<subnombre> permite identifcar la base de datos. En el caso anterior, wombat es suficiente porqu utiliza ODBC. Una base de datos requiere negeneral ms informacin: //hostname:port/subsubname
Ejemplo: jdbc:dbnet://wombat:356/fred

Integracin de Java y la WWW


Estructura de una aplicacin fichar sin JDBC
Mquina cliente Browser
Formulario ficha

(1)

(2) Red Mquina servidora de Web (4)

La correcin de errores debe La correcin de errores debe hacerse en el script del hacerse en el script del servidor. HTML no lo permite servidor. HTML no lo permite La aplicacin consume tiempo La aplicacin consume tiempo de proceso en el servidor de proceso en el servidor El servidor se convierte en El servidor se convierte en cuello de botella potencial cuello de botella potencial

Mquina servidora de DBMS (5) (6) Proceso servidor DBMS


Joan Vila

CGI
Script para procesado fichas

Proceso servidor de red


Joan Vila

(3) (7)

Procesamiento distribuido en Java

187

Procesamiento distribuido en Java

188

Integracin de Java y la WWW


Estructura de una aplicacin utilizando Applets y JDBC
Mquina cliente Browser
APPLET fichar

(2)
JDBC

(1) Red Mquina servidora de Web (3)

El applet hace el procesamiento de El applet hace el procesamiento de la ficha yyde los errores. la ficha de los errores. El applet comunica directamente El applet comunica directamente con la base de datos. con la base de datos. Procesamiento totalmente Procesamiento totalmente realizado por el cliente realizado por el cliente

Mquina servidora de DBMS

Proceso servidor de red

Proceso servidor DBMS


Joan Vila

Procesamiento distribuido en Java

189

También podría gustarte