Programación Orientada a
Ojetos
M.C. Juan Carlos Olivares Rojas
[email protected]
http://antares.itmorelia.edu.mx/~jcolivar
Noviembre, 2009
Programación Orientada a
Objetos
• ¿Cuál es la diferencia entre una estructura y
una clase si las dos son ADT (Tipos de Datos
Abstractos)?
• La encapsulación
• La encapsulación permite colocar datos
lógicamente relacionados como constantes,
variables, funciones en una sola entidad.
Ejemplos son los paquetes y clases.
POO
• La visibilidad y el ocultamiento de
información es sumamente importante.
la
• Este paradigma basa su funcionamiento en la
creación de objetos que se dan a través de
moldes predeterminados llamado clases.
• No es reinventar la rueda, simplemente es
estructurar de mejor forma el paradigma
imperativo.
POO
• La reutilización de componentes como son
los mecanismos de herencia y polimorfismo
hacen que la construcción de código sea más
simple.
• El primer lenguaje basado en este paradigma
fue Smalltalk. Lenguajes como Java son
considerado lenguajes orientados a objetos
no puros, ya que tienen componentes de
programación estructurada.
POO
• En esta unidad se verán conceptos avanzados
del paradigma orientado a objetos así como
mejores prácticas de desarrollo.
• Se seguirá una dinámica parecida a la de la
unidad pasada.
Refactorización
• La refactorización es el proceso que consiste
en cambiar la estructura interna de un
programa sin modificar su comportamiento
externo.
• La refactorización es parte importante del
proceso de reingeniería y puede enfocarse a
la reestructuración de códigos
• Las herramientas actuales permiten más que
simplemente buscar una cadena de texto y
sustituirla por otra.
• Al hacer uso de la refactorización permiten
una reestructuración más simple y menos
propensa a errores.
• NetBeans desde su versión 5.0 soporta
refactorización.
Refactorización
Refactorización
• Las principales herramientas con las que se
cuenta son:
• Renombrado para cambiar de manera
segura el nombre (si no se aplica a esto, un
comando de sustituir todo puede ser
perjudicial), mover, copiar, borrar, cambiar
parámetros de los métodos, encapsular
campos de una clase (crear métodos
get/set).
• Se pueden extraer elementos para crear
interfaces, se pueden introducir variables,
constantes, métodos, atributos.
• En algunos casos es más tardado usar la
herramienta que realizar la reestructuración
de código a mano.
• En NetBeans y algunos otros IDEs se
cuentan con herramientas para manipular el
código fuente.
Refactorización
Refactorización
• Para dar formato (si es que el código no se
creo en un IDE), eliminar espacios en
blanco innecesarios, identar a la izquierda y
a la derecha, subir, bajar líneas, duplicar
líneas, completar, insertar código, etc.
• Estas herramientas pueden utilizarse para
generar patrones repetitivos de código en
funciones.
Refactorización
• Para la reestructuración de códigos se
pueden seguir convenciones ya definidas las
más importantes son la notación húngara y la
notación de camello.
• La notación húngara fue creada por Charles
Simonyi de Microsoft, el cual es húngaro y
por eso recibió ese nombre.
Notación Húngara
• Es un método ampliamente usado sobre todo para
convención de nombres de variables.
• Consiste en tener variables autodocumentadas
agregando un prefijo de tres caracteres o menos
para indicar su tipo.
• Las abreviaturas de los tipos de datos puede variar
dependiendo del lenguaje de programación.
Descripción
Abr
Objeto (parecido a
las estructuras)
o*
Manejador
(handler)
h
p
Descripción
Abr
Carácter con signo
c
Carácter sin signo
b
Entero
n
Palabra (entero sin
signo)
w
Puntero a entero de
16 bits
lp
Doble palabra
(entero 32 bits)
dw
Puntero largo (32
bits)
Enumeraciones
Largo
l
Flotante
f
Doble
d
Cadena terminada
en /0
sz
Estructura Abc
sA
Descripción
Abr
Formulario
frm
CheckBox
chk
Botón
cmd
Imagen
img
e
Etiqueta
lbl
Puntero largo a una
cadena terminado
en nulo
lpsz
Menú
mnu
PictureBox
pic
Puntero largo a una
función que
devuelve un entero
lpfn
TextBox
txt
ComboBox
cbo
Línea
lin
Notación Húngara
Notación húngara
•
•
•
•
•
•
•
•
int nTest;
long lTemp;
char *szString = "Prueba";
struct Rect srRect;
int nMiVariableEjemplo;
char szEjemploString;
int NNOMBREINVALIDO;
int nNombre_Incorrecto;
• Las funciones o subrutinas no se les agrega
abreviaciones, se recomiendan tengan un
nombre descriptivo.
• Los nombres
mayúsculas.
de
las
clases
van
en
• Se pueden tener nuevos tipos de datos sólo
se
deben
de
poner
las
nuevas
nomenclaturas.
Notación Húngara
Notación de Camello
• Es la utilizada por Java y herramientas
afines. Su uso está creciendo en
popularidad mientras que la notación
húngara va en desuso.
• Su principal característica consiste en que
no separa nombres de identificadores
(variables, métodos, objetos) con “_” para
palabras compuestas.
Notación de Camello
• Los identificadores tienen la forma de la
joroba de un camello. No se indican tipos
de datos. Sigue respetando mucho de la
Notación C.
• Los métodos inician en minúsculas y si hay
una palabra compuesta esta inicia con
mayúscula dando la apariencia de una
joroba.
Notación Camello
• Las clases inician con mayúscula siguiendo
el mismo método.
• Los métodos para acceder a atributos de las
clases no públicos deben llamarse por
convención set y get.
Reutilización
• El reuso es una de las técnicas de resolución
de problemas que más utilizamos los
humanos. De hecho es lo primero que
verifica nuestro cerebro.
• El reuso en software nos ayuda a mejorar la
producción y calidad del software al “no
reinventar la rueda”.
• El reuso nos permite afrontar los grandes
proyectos de software sin mayores
complicaciones. Desafortunadamente no
todo se puede reutilizar.
• La reutilización es la propiedad de utilizar
conocimiento, procesos, metodologías o
componentes de software ya existente para
adaptarlo
a
una
nueva
necesidad,
incrementando significativamente la calidad y
productividad del desarrollo.
Reuso
Reutilización
• La reutilización puede ser composicional,
generativa y adapativa.
• Es composicional cuando se orienta al
reuso del producto. Puede ser de caja
blanca (si nos interesa modificar el
comportamiento), caja negra (cuando no se
puede modificar el comportamiento) y
adaptativo cuando es una mezcla de
ambos.
Reutilización
• La reutilización por generación se da cuando
se utilizan esfuerzos previos del desarrollo de
software.
• Para que un objeto pueda ser reusable se
necesita de un alto nivel de abstracción.
Entre mayor es su nivel de abstracción,
mayor es su nivel de reuso.
Reuso
• Tipos de reuso:
• Código reciclado: utilizar parte del código
definido en otros proyectos.
• Componentes de código: consiste en utilizar
módulos, clases, APIs, etc.
• Esquemas: DFD, Diagramas UML.
Reuso
• Frameworks: Solución integrada para la
resolución de problemas en un contexto
particular. Se pueden utilizar patrones de
diseño. Un ejemplo de Framework es .NET
• Las etapas del proceso de reuso son:
• Adquisición del requerimiento.
Reuso
• Búsqueda y Recuperación
– Recuperación por Palabras Claves
– Recuperación Basada en la Estructura
– Recuperación Enumerada
• Identificación
• Adecuación
Reingeniería del Software
• Sucede que si una aplicación necesita ser
modificada constantemente y no tiene una
metodología de seguimiento del desarrollo
del proyecto, la modificación del software se
vuelve sumamente complicada.
• El mantenimiento de software en algunos
casos puede llegar a ser del 60% del total
de costos del proyecto.
• Aún cuando un software se haya
desarrollado con la mejor metodología de
software tendrá que ser modificado en un
futuro por algún motivo, debido a que lo
único constante es el cambio.
• Los tipos de mantenimiento de Software
son: correctivo, adaptativo, mejoras o
mantenimiento
de
perfeccionamiento,
mantenimiento preventivo o reingeniería.
Reingeniería del Software
• El 80% del tiempo del desarrollo del software
se ocupa en la adaptación del software a su
ambiente externo.
• La reingeniería de software es costosa y
consumidora de tiempo.
• La reingeniería es una actividad de
reconstrucción, preferible de realizar antes
de que se “derrumbe” la obra.
Reingeniería del Software
• Antes de derribar una casa, quizás se
necesita corroborar que está mal.
• La reingeniería es un proceso que altera los
elementos internos de toda obra, no es una
sola remodelación de la fallada.
• Generalmente se siguen los siguientes
pasos para aplicar reingeniería:
Reingeniería de Software
Reingeniería de Software
•
•
•
•
•
•
Análisis de Inventario
Reestructuración de Documentos
INGENIERÍA INVERSA
Reestructuración de Códigos
Reestructuración de Datos
Ingeniería directa
• Se aplica para obtener un modelo detallado
de análisis, ingeniería de requerimientos,
diseño y en algunos casos implementación
teniendo una solución, la cual es una
actividad consumidora de tiempo.
• Tanto la Ingeniería Inversa como la
Reingeniería en la mayoría de las licencias
de Software se encuentran penadas por la
ley.
Ingeniería Inversa
Javadoc
• Es el estándar para crear documentación
para los proyectos en Java.
• Es una herramienta estándar del JDK de Sun
Microsystem. Crea documentación en HTML
y casi cualquier IDE lo hace.
• Se deben utilizar los comentarios especiales
/** …..*/ con algunas palabras clave para
determinar la documentación.
Javadoc
• Las palabras clave inician con una arroba.
• Se puede incrustar cualquier etiqueta de
HTML para hacer más visible la
documentación.
• @author nombre_desarrollador
• @deprecated descripción //indica
método que no se utiliza su uso
un
Javadoc
• @param nombre descripción
• @return descripción //no se debe utilizar
con métodos void.
• @see referencia //asocia con otro elemento
el
cual
puede
ser:
#método();
clase#método();
paquete#método();
paquete.clase#método().
• @throws clase descripcion
• @version versión
Javadoc
• La documentación se crea de la siguiente
forma: javadoc archivo.java
• En NetBeans se puede encontrar la opción
en el menú Build en la opción Generate
JavaDoc for …
• Se recomienda realizar tanto el código
como las clases en inglés.
Javadoc
/**
* Thrown to indicate that the application has
attempted to convert
* a string to one of the numeric types, but that
the string does not
* have the appropriate format. *
* @author unascribed
* @version 1.16, 02/02/00
* @see java.lang.Integer#toString()
* @since JDK1.0
*/
public class NumberFormatException extends
IllegalArgumentException {
/**
*
Constructs
a
<code>
NumberFormatException </code> with no
detail message.
*/
public NumberFormatException () { super(); }
Javadoc
Javadoc
/**
*
Constructs
a
<code>
NumberFormatException </code> with the
* specified detail message.
* @param s the detail message.
*/
public NumberFormatException (String s) {
super (s); } }
• La ofuscación es una técnica avanzada de
refactorización que permite a un código
mantenerle obscuro (es decir no muy
legible) con diversos propósitos de
optimización.
• ¿Para que se hace ofuscación?
• ¿No viola esto el principio de claridad en la
implantación?
Ofuscación
• La ofuscación se realiza en muchas casos
para hacer un código ilegible, también en
muchos casos se puede reducir el tamaño
del código fuente y del código binario
realizado.
• Al realizar cualquier tipo de programa se
puede aplicar técnicas de reingeniería como
la ingeniería inversa para de un código
binario tratar de obtener su código fuente.
Ofuscación
• En mucho tipos de aplicaciones como las
aplicaciones móviles se ofusca el código
objeto generado para obtener un código
más pequeño.
• Un programa puede ser fácilmente
decompilable, por este motivo se ofusca
con la premisa de que si esto llegará ocurrir,
el que lo hiciera le costaría mucho trabajo
entender el programa y modificarlo.
Ofuscación
Ofuscación
• En el caso de programas ejecutables (.exe)
es mucho más difícil obtener un código en
lenguaje de alto nivel, dado que el proceso
de decompilación deja sus resultados en
ensamblador y por lo tanto es necesario
saber como el compilador ensambla cada
línea de código. Por este motivo muchas
empresas grandes del sector informático
realizan sus proyectos en sus propios
compiladores.
• Actualmente la ofuscación se emplea más
en la ofuscación de código dinámico, dado
que aquí es muy importante tanto el tamaño
del código como la legibilidad de este, tal es
el caso de HTML.
• La ofuscación si bien es cierto viola
principios de buena prácticas de Ing. de
Software, se realiza con un propósito
específico hasta el final del proceso.
Ofuscación
Ofuscación
• En algunos casos la ofuscación se logra
simplemente refactorizando el nombre de
las variables pero en muchos casos esto no
sirve.
• Para lograr la ofuscación se deberá
modificar el flujo del programa de tal forma
que menos instrucciones o en algunos
casos más instrucciones deben de realizar
el mismo programa.
• En algunos casos resulta que ofuscar el
código puede ser que el tamaño del código
fuente y del programa aumente, debido a
que es común que las variables tengan
nombres muy grandes o bien se incluyan
instrucciones extras, se descompongan
ciclos, se cambien y mapeen estructuras,
etc.
• Existen concursos de ofuscación de código
Ofuscación
Ofuscación
Sockets Java
• Java es un lenguaje multiplataforma que al
igual que otros lenguajes de programación
tiene APIs para la comunicación de procesos
remotos.
• La ventaja de utilizar sockets en Java con
respecto a su contraparte en C, radica en que
Java enmascara la complejidad de los
procesos en clases más simples.
Sockets Java
• Para utilizar sockets y clases similares se
necesita utilizar el paquete java.net.*;
• Se pueden utilizar clases específicas para
conectarse a servicios de red determinados
como http, ftp, entre otros.
//Servidor usando sockets stream
ServerSocket ss = new ServerSocket(5000, 100);
Servidor Stream
Socket con = ss.accept();
OutputStream sal = con.getOutputStream();
String s = new String(“ITMorelia\n”);
for(int i=0; i < s.length(); i++)
sal.write((int) s.charAt(i));
Conection.close();
Cliente stream
Socket
c
=
new
Socket(InetAddress.getLocalHost(), 5000);
InputStream entrada = c.getInputStream();
char c;
while((c = (char) entrada.read()) != ‘\n’)
System.out.println(String.valueOf(c));
Servidor datagramas
try {
DatagramSocket sS = new DatagramSocket();
DatagramSocket rS = new DatagramSocket(
5000);
} catch(SocketException SE) {
SE.printStackTrace();
System.exit(1);
}
Servidor datagramas
byte a = new byte [100];
DatagramPacket rP = new DatagramPacket( a,
a.length);
rS.receive(rP);
System.out.println(“Dirección:” + rP.getAddress()
+ “ Puerto” + rP.getPort + “ longitud:”
+rP.getLength());
Servidor datagramas
byte d[] = rP.getData();
sP =
new
DatagramPacket(d,
rP.getAddress(), 5001);
d.length,
sS.send(sendPacket);
InetAddress
comp
InetAddress.getByName(“www.itc.edu.mx”);
=
Sockets Java
• Otras excepciones que se pueden capturar:
• UnknownHostException
• EOFException
• ConnectException
Sockets en Java
• Se recomienda la utilización en las nuevas versiones
de Java de los flujos ObjectInputStream y
ObjectOutputStream, los cuales son serializables.
• El cierre de los flujos debe hacerse en orden inverso
de cómo se crearon.
• Se pueden
cambiar
algunas
opciones
de
configuración como s.setSoTimeout(5000); //Tiempo
de interrupción de lectura.
Sockets Java
• También se recomienda el uso de un objeto
PrintWriter para manejar de mejor forma la
escritura a través de un socket.
PrintWriter
escritor
=
PrintWriter(socket.getOutputSream());
escritor.println(“Mensaje: ” +mensaje);
escritor.flush();
new
Sockets Java
• También se puede utilizar un objeto Scanner para leer
desde un socket.
Socket s = new Socket(“time-A.timefreq.bldrdoc.gov”,
13);
InputStream e = s.getInputStream();
Scanner in = new Scanner(e);
while(in.hasNextLine()) {
String l =in.nextLine(); System.out.println(l);
}
2.1.2 RPC
• Las llamadas a procedimientos remotos (RPC)
fue el primer intento por obtener un middleware
para la construcción de sistemas distribuidos.
• Su funcionamiento se basa en la arquitectura
cliente/servidor siendo totalmente transparente
para el usuario.
RPC
• El problema del manejo de procesos
distribuidos con sockets radica en que se basa
en el flujo de E/S, haciendo los programas más
difíciles de estructurar.
• En 1984 Birelly y Nelson idearon el modelo de
RPC
a
semejanza
del
llamado
de
procedimientos locales (LPC).
RPC
• El nivel de transparencia en RPC es muy alto
ya que el usuario no tiene que ver con detalles
de conexión.
• La simplicidad de toda esta heterogeneidad en
el llamado a un procedimiento remoto es
realizado por los stubs (resguardos) tanto en el
cliente como en el servidor.
RPC
• Para la transferencia de datos entre los stubs,
se necesita de un proceso de empacar
desempacar los parámetros y resultados. Dicho
proceso recibe el nombre de marshalling.
• Los stubs se comunican con los núcleos de
cada proceso logrando una transparencia muy
alta.
RPC
• La secuencia de mensajes RPC es la
siguiente:
1.El procedimiento cliente llama al stub del
cliente de la manera usual.
2.El stub del cliente construye un mensaje y
hace un señalamiento al núcleo.
3.El núcleo envía el mensaje al núcleo remoto.
RPC
4. El núcleo remoto proporciona el mensaje al
stub del servidor.
5. El stub del servidor desempaca los
parámetros y llama al servidor.
6. El servidor realiza el trabajo y regresa el
resultado al stub.
7. El stub del servidor empaca el resultado en un
mensaje y hace un señalamiento al núcleo.
RPC
8. El núcleo remoto envía el mensaje al núcleo
del cliente.
9. El núcleo del cliente da el mensaje al stub del
cliente.
10.El stub desempaca el resultado y lo regresa al
cliente.
• El manejo de los datos se hace a través de
XDR (eXternal Data Representation).
RPC
• Para el envío de datos se utiliza la siguiente
forma canónica: Complemento a 2 los enteros,
ASCII caracteres, 0 (falso) y 1 verdadero,
formato IEEE decimales, todo guardado como
little endian.
• En la práctica RPC no es lo mismo que un
procedimiento local a la hora de revisar los
mecanismos de fallas.
RPC
• La semántica de fallas de RPC es la
siguiente:
1.El cliente no puede localizar al servidor.
2.Se pierde el mensaje de solicitud del cliente
al servidor
3.Se pierde el mensaje de respuestas del
servidor al cliente.
4.El servidor falla antes de recibir una solicitud.
RPC
5. El cliente falla después de enviar una
solicitud.
• En
general
existen
diversas
implementaciones de RPC, siendo las más
extendidas sobre TCP/IP, la cual tiene los
siguientes puntos a favor:
• El protocolo ya ha sido diseñado, lo que
ahorra trabajo considerable.
RPC
• Se dispone de muchas implementaciones.
• Esta disponible en casi cualquier sistema
Unix.
• Tanto TCP como UDP están soportados por
muchas redes.
• Las implementaciones más evolucionadas de
RPC incluye la de Sun ONC (Open Network
Computing) y DCE (Distributed Computing
Environmet).
RPC
• RPC está desarrollado en C, pero algunas
versiones permiten programar en otros
lenguajes como Fortran. Las implementaciones
más actuales trabajan sobre XML formando los
XML-RPC.
• Para la conexión entre un cliente y un servidor
utilizando RPC se siguen dos pasos: localizar
la máquina servidor, y localizar el proceso en
esa máquina.
RPC
• Para encontrar dichos servicios se necesita de
un demonio RPC que se encuentre
monitoreando todos los procesos remotos,
dicho proceso se llama portmap , el cual
escucha en el puerto 111.
• Muchos servicios de red utilizan RPC para
funcionar, entre ellos NFS, el cual es un
sistema de archivos distribuidos.
RPC
• Un programa en RPC se crea a través de un lenguaje
de definición de interfaces (IDL por sus siglas en
Inglés). Tiene la extension .X
program RAND_PROG {
version RAND_VER {
void INICIALIZA_RANDOM(long) =1;
doble OBTEN_SIG_RANDOM(void) = 2;
} =1; /*No. de version*/
} = 0x31111111; /*No. de programa*/
RPC
• rpcgen -c -a rand.x
•
•
•
•
•
•
rand_server.c servidor
rand_svc.c stub del servidor (no se modifica)
rand.h cabeceras
rand_clnt.c stub del cliente (no se modifica)
rand_client.c cliente
rand_xdr.c manejo de estructuras
RPC
•
•
•
•
00000000-1FFFFFFF Definidos por sun
20000000-3FFFFFFF Definidos por el usuario
40000000-5FFFFFFF Transitorios
60000000-FFFFFFFF Reservados para usos
futuros
• rpcinfo -s
• portmap
RPC
const MAX = 100;
typedef int Longitud;
struct argumentos {
float salario;
Longitud tam;
};
• Sólo se puede recibir y enviar un parámetro.
RPC
• Existen nuevas propuestas para mejorar el
desempeño de RPC como RPC2 que maneja
UDP. También se han diseñado mecanismos
como MultiRPC para el manejo de RPCs en
paralelos. Existen otras alternativas como
LRPC (RPC ligeros) que se basan en
optimizaciones de la copia de datos y de la
planificación de los hilos.
• RPC está definido en el RFC 1831.
RMI
• La invocación de métodos remotos es la versión
orientada a objetos de la filosofía RPC.
• Los programas realizados en Java deben heredar de
la clase remote.
• A la hora de ejecutar se deben indicar las políticas de
seguridad. Esto se hace a través del parámetro -D de
java
RMI
java -Djava.security.policy=politica prg
• Los archivos de stub se generan con el
comando rmic -d . Prg
• El primer paso consiste en inicializar el
rmiregistry (similar al portmapper en RPC)
RMI
• Al proxy en el lado cliente se le llama stub,
mientrás que en el servidor se le llama
skeleton.
• Se cuenta con la primitiva invoke(objeto,
método, param_entrada, param_salida);
• Se necesita de un proceso enlazador
(binder) que una a un cliente con el objeto
remoto.
RMI
import java.rmi.*;
import java.util.Vector;
public interface Forma extends Remote {
int dameVersion() throws RemoteException;
GraphicObject
dameTodoEstado()
throws
RemoteException;
}
RMI
public interface ListaForma extends Remote {
Forma nuevaForma(GraphicObject g) throws
RemoteException;
Vector todasFormas() throws RemoteException;
int dameVersion() throws ReomteException;
}
RMI
//Sirviente ListaForm
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.util.Vector;
public
class
SirvienteListaForma
extends
UnicastRemoteObject implements ListaForma {
private Vector laLista;
private int version;
RMI
public
SirvienteListaForma()
thorws
RemoteException {;}
public Forma nuevaForma(GraphicObject g)
thorws RemoteException {
version++;
Forma s = new SirvienteForma(g, version);
laLista.addElement(s);
return s; //implementar los demás métodos
}
}
RMI
• Para acceder al enlazador (RMIRegistry) se
utilizan métodos de la clase Naming, utilizando
las siguiente URI:
• rmi://nombrecompu:puerto/nombreObjeto
• Los clientes deben hacer consultas (lookup) a
computadoras concretas. Otros métodos son:
rebind(), bind(), unbind() y list().
RMI
//Programa servidor
public class ServidorListaForma {
public void main(String args[]){
System.setSecurityManager(new
RMISecurityManager());
try {
ListaForma
unaListaForma
SirvienteListaForma();
=
new
RMI
Naming.rebind(“Lista Forma”, unaListaForma);
System.out.println(“Servidor de ListaForm
Listo”);
} catch (Exception e) {
System.out.println(“Error:
”
+e.getMessage());
}
}
}
RMI
//Cliente
import java.rmi.*;
import java.rmi.server.*;
import java.util.Vector;
public class ClienteListaForma {
public static void main(String args[]) {
System.setSecurityManager(new
RMISecurityManager());
ListaForma unaListaForma = null;
RMI
try {
unaListaForma
=
(ListaForma)
Naming.lookup(//jcolivares.ListaForma);
Vector
sLista
=
unaListaForma.todasFormas();
}
catch(RemoteException
e)
{
System.out.println(e.getMessage()); }
catch (Exception e) { ;}
}
}
RMI
• El marshalling se hace en formato Big-endian.
• Jerarquía de clases en RMI:
• Object --> RemoteObject (Remote) --> RemoteStub,
RemoteServer (UnicastRemoteObject)
• El puerto por el cual escucha el RMI es el 1099
(rmi://localhost:1099/Objeto)
RMI
• Ejemplo de archivo de política de seguridad:
grant {
permission java.net.SocketPermission
“*:1024-65535”, “connect”;
permission java.io.FilePermission
“directorio”, “read”;
permission java.security.AllPermission;
};
CORBA
• Common Object Request Broker Architecture
• Es un middleware para la construcción de
sistemas distribuidos utilizando el paradigma
de programación orientada a objetos.
• Una de las principales ventajas de CORBA
es que cada uno de los componentes de
CORBA se pueden implementar en una gran
variedad de lenguajes.
CORBA
//Ejemplo de IDL en CORBA
struct Persona {
string nombre;
long año;
};
interface ListaPersonas {
void añadePersona(in Persona p);
long damePersona(in string nombre,
Persona p);
};
out
CORBA
• CORBA maneja un modelo asíncrono de
comunicación, aunque también se puede
manejar un esquema de polling.
• CORBA
utiliza
muchas
tecnologías
estandarizadas como IOR (Interoperable Object
Reference), IIOP(Internet Inter ORB Protocol),
ORB (Object Request Broker Architecture),
entre otras.
CORBA
• CORBA es una arquitectura genérica, de tal
forma que otras tecnologías de objetos como
RMI se pueden ejecutar a través de IIOP.
• CORBA está basado en una arquitectura de
cuatro capas con proxys en el lado cliente y
servidor.
CORBA
• Para realizar objetos remotos en Java se utiliza el
Java IDL, el cual está incluido en las diferentes
versiones de JDK.
• Las interfaces de los objetos remotos se hacen a
través del IDL de CORBA.
interface Produto {
string getDescripcion();
}
CORBA
• El compilador de IDL a Java se llama idlj o
idltojava en versiones antiguas:
• idlj Producto.idl
• public
interface
Producto
org.omg.CORBA.Object,
org.omg.CORBA.portable.IDLEntity
extends
CORBA
• Los parámetros de los métodos pueden ser in,
out, inout. Los parámetros in son por valor, out
referencia, inout referencia con valor inicial.
• En Java no existen las referencias por lo que
se simulan (clases holder).
• IDL no soporta sobrecarga de métodos.
CORBA
• La palabra clave atrribute de IDL hace
referencia a métodos set y get
module Aplicación {
interface producto {
attribute string isbn;
};
interface Almacen { …};
};
CORBA
• Al ejecutar idlj Producto.idl se crean:
• Producto.java //definición interfaz
• ProductoHolder.java
//clase
contenedor
parametros out
• ProductHelper.java // Clase auxiliar
• _ProductStub.java //Stub con el ORB
CORBA
• El mismo ILDL se puede compilar en C++
haciendo uso de la herramienta omniORB, el
cual se ejecuta: omniidl –bcxx Producto.idl
• El cual genera:
• Producto.hh: Producto, Producto_Helper,
POA_Producto
• ProductoSK.cc implementación
y
CORBA
• Para ejecutar el servicio de nombres se corre el
programa tnameserv (depreciado) o el orbd con
el parámetro –ORBInitialPort 2809
import org.omg. CosNaming.*;
import org.omg.CORBA.*;
public class EntCliente {
public static void main(String args[]) {
try {
CORBA
ORB orb = ORB.init(args, null);
org.omg.CORBA.Object
n
=
orb.resolve_initial_references(“NameService”
);
NamingContext
contexto
=
NamingContextHelper.narrow(n);
NameComponent[]
ruta
=
{
new
NameComponent(“principal”, “Context”), new
NameComponent(“Objeto”, “Object”)};
CORBA
org.omg.CORBA.Object
obj
contexto.resolve(ruta);
Obj o = ObjHelper.narrow(obj);
System.out.println(o.getenv(“PATH”));
} catch (Exception e) {
e.printStackTrace();
}
}
}
=
CORBA
• Para implementar servidor CORBA en java se
debe ejecutar idlj –fall archivo.idl
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
public class SysPropImpl extends SysPropPOA {
public String getProperty(String clave) {
CORBA
return System.getProperty(clave);
}
}
public class ServidorPropSis {
public static void main(String args[]) {
try {
ORB orb = ORB.init(args, null);
POA
poaraiz
=
(POA)
orb.resolve_initial_references(“RootPOA”);
CORBA
poaraiz.the_POAManager().activate();
SysPropImpl impl = new SysPropImpl();
org.omg.CORBA.Object
ref
=
poa.raiz.servant_to_reference(impl);
org.omg.CORBA.Object
objContDenom
=
orb.resolve_initial_references(“NameService”);
NamingContext
contexto
=
NamingContextHelper.narrow(objContDenom);
CORBA
NameComponent[]
ruta
=
{
NameComponent(“SysProp”, “Object”)};
Contexto.rebind(ruta, ref);
orb.run();
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
new
Modelo de servicios Web
Clientes
ricos
XML
Browsers
estándar
Dispositivos
móviles
Servicios Web
Formularios Web
Lógica aplicación
Servicios SO
Otros
servicios
Servicios Web
• Los servicios Web van de la mano de las
tecnologías XML.
• XML nos sirve para estandarizar el marshalling
de los datos.
• Utilizar la Web nos permite tener un puerto no
bloqueando por Firewall
Servicios Web
• Son la invocación de código remoto
utilizando protocolos estandarizados.
• En conclusión, realizan la misma función que
los sockets, RPC, RMI, Corba y demás
tecnologías distribuidas.
• Se puede ver a los servicios Web como una
analogía de un procedimiento almacenado
en una base de datos.
¿Qué son los Servicios Web?
• "A Web service is a software system designed to
support interoperable machine-to-machine interaction
over a network. It has an interface described in a
machine-processable format (specifically WSDL).
Other systems interact with the Web service in a
manner prescribed by its description using SOAPmessages, typically conveyed using HTTP with an
XML serialization in conjunction with other Webrelated standards."
Definición de SW
• La aplicación que actúa como cliente debe
conocer:
– La URL del servidor remoto que ofrece el
servicio,
– El nombre del servicio que se solicita, y
– Los parámetros que se deben enviar junto
con la llamada al servicio.
• Estos datos se enviarán mediante HTTP
Definición de SW
• El servidor que ofrece el servicio web leerá los
parámetros que se le han enviado, llamará a un
componente o programa encargado de
implementar el servicio, y los resultados que se
obtengan de su ejecución serán devueltos al
servidor que solicitó la ejecución del servicio.
Servicios Web
• Un servicio Web no es un XML RPC como tal,
se diferencia en la forma en que trabajan.
• Los servicios Web forman la base de la
arquitectura orientada a servicios (SOA)
• Los servicio Web utilizan generalmente el
método POST de HTTP para enviar los datos
de la invocación del servicio.
SOA (Arquitectura Orientada a
Servicios)
Proveedor de Servicios
Publicar
Registro de Servicios
Descripción
Servicio
Encontrar
Conectar
Solicitante de Servicio
Cliente
Servicios Web
• Los datos viajan envueltos en un protocolo llamado
SOAP (Simple Object Access Protcol) que hace el
marshalling de los datos.
• Una de las principales características que tienen los
servicios Web radica en su ubicuidad, ya que pueden
ser accedidos desde cualquier sitio, utilizando
inclusive cualquier otro protocolo de transporte SMTP,
FTP, etc.
SOAP
• Indica cómo se deben codificar los mensajes
que circularán entre las dos aplicaciones.
• SOAP define dos modelos de mensajes:
– Un mensaje de solicitud.
– Un mensaje de respuesta.
Mensaje de solicitud
<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope
xmlns:SOAPENV=”http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<catalogo:buscaIsbn xmlns:catalogo="http://catalogo.org/cat">
<catalogo:isbn>
84-4553-3334-2X
</catalogo:isbn>
</catalogo:buscaIsbn>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Mensaje de respuesta
<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope
xmlns:SOAPENV=”http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<catalogo:buscaIsbnResponse xmlns:catalogo="http://catalogo.org/cat">
<catalogo:titulo>
Catalogar materiales especiales
</catalogo:titulo>
<catalogo:autor>Marta de Juanes</catalogo:autor>
</catalogo:buscaIsbnResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Servicios Web
• Los servicios Web necesitan ser descritos (saber que
parámetros reciben, devuelven) para poderlos utilizar
en diversos clientes. Esta descripción se realiza a
través de WSDL (Web Service Definition Language).
• Generalmente esas descripciones los clientes las
conocen o bien, puede descubrirlas haciendo uso de
UDDI (Universal Description, Discovery and
Integration).
Servicios Web
• La UDDI no es otra cosa que un repositorio en
donde se almacenan servicios Web que
pueden ser invocados por diversos clientes.
• Muchas empresas ofrecen servicios Web como
amazon, google, http://www.xmethods.com
¿Por qué utilizar Servicios Web?
• Múltiples tecnologías para hacer lo
mismo:
– No interoperables entre sí.
– Ligados a una plataforma.
DCOM
CORBA
Java RMI
Protocolo
RPC
IIOP
IIOP or JRMP
Formato del mensaje
NDR
CDR
Java Ser. Format
Descripción
IDL
OMG IDL
Java
Descubrimiento
Windows Registry
Naming Service
RMI Registry or JNDI
Pila de protocolos de SW
• Redefinición de
comunicaciones
toda
la
pila
– Basado en tecnologías estándares
Servicio web
Protocolo
HTTP
Formato del mensaje
SOAP
Descripción
WSDL
Descubrimiento
UDDI
de
Ventajas de los Servicios Web
• Basados en estándares.
– Fácil integración.
• Desarrollo de actividades modularizadas.
• Independencia de plataforma.
• Puede ser usado tanto en clientes ligeros como
pesados (clientes heterogéneos).
Desventajas de los Servicios Web
• Es que no son seguros...
• Es que no tienen estado...
• Es que no son transaccionales...
• “Los servicios Web no hacen más que
reinventar la rueda, pero esta vez usando
XML”.
Protocolos Servicios Web
Publicar, buscar servicios:
UDDI
Descripción de servicios: WSDL
Interacción de servicios:
SOAP
Formato de datos universal: XML
Comunicaciones ubicuas:
Internet
Creando Servicios Web
• Los servicios Web XML se exponen en el
Framework .NET como archivos con una
extensión .asmx.
• Los servicios se pueden consumir a través de
páginas Web, clientes ligeros en una PC o
clientes inteligentes en dispositivos móviles.
Hola mundo!!!
<%@ WebService Language="C#“ class="Helloweb" %>
using System.Web.Services;
[WebService
(Namespace="http://sybex.com/webservices")]
public class Helloweb: WebService{
[WebMethod]
public string HelloWebService() {
return "Holla Mundo!";
}
Otro servicio Web
<%@ WebService Language="C#" class="Fibonacci" %>
using System.Web.Services;
public class Fibonacci : WebService{
[WebMethod]
public int GetSeqNumber(int fibIndex){
if (fibIndex < 2)
return fibIndex;
int[] FibArray = {0,1};
for (int i = 1; i< fibIndex; i++){
FibArray[1] = FibArray[0] + FibArray[1];
FibArray[0] = FibArray[1] - FibArray[0];
}
return FibArray[1];
}
}
Cliente del servicio
using System;
class ClienteFecha
{
public static void Main()
{
ServicioFecha s = new ServicioFecha();
Console.WriteLine(“Fecha actual: {0}”, s.Fecha(false));
Console.WriteLine(“Fecha actual detallada: {0}”, s.Fecha(true));
}
}
Cliente de servicio Web Windows C#
.NET
Agregar referencia Web
Cliente de servicio Web en una Pocket
PC
Página Web del Servicio HelloWorld
Respuesta del servicio Web par
Página Web del Servicio 1
WSDL del servicio Web 1
Ejecución del servicio Web suma
Ejecución del servicio Web par
Crear proxy del servicio Web
Servicios Web
• Ejemplo de archivo WSDL de amazon
• <operation name=“AuthorSearchRequest”/>
• <input
message=“typens:AuthorSearchRequest”/>
• <output
message=“typens:AuthorSearchResponse”>
• </operation> ….
Servicios Web
Los tipos de datos se definen en otra parte
<xsd:complexType name=“AuthorRequest”>
<xsd:all>
<xsd:element name=“autor” type=“xsd:string”/>
<xsd:element
name=“sort”
type=“xsd:string”
minOccurs=“0”/>
</xsd:all>
</xsd:complexType>
Servicios Web
• Cuando se traduce a Java queda:
public class AuthorRequest {
public AuthorRequest(String author, String page,
String mode, String tag, String sort, String
locale, String word, String price) {…}
public String getAuthor() {…}
public String getPage() {…} ….
}
Servicios Web
Para ejecutar el servicio se utiliza:
AmazonSearchPort puerto = (AmazonSearchPort) (new
AmazonSearchService_Impl().getAmazonSearchPort(
));
AuthorRequest solicitud = new AuthorRequest(name,
“1”, books, “”, “lite”, “”, token, “”, “”, “”);
ProductInfo res= puerto.autorSearchRequest(solicitud);
Servicios Web
• Se ocupa en las versiones viejas el JWSDP
(Java Web Service Developer Pack)
• Se necesita un archivo config.xml
<?xml version=“1.0” encoding=“UTF-8”?>
<configuration
xmlns=http://java.sun.com/xml/ns/jaxrpc/ri/config>
Servicios Web
•
<wsdl
location=“http://soap.amazon.com/schemas3/A
mazonWebServices.wsdl”
packageName=“com.amazon” />
• </configuration>
• wscompile –import config.xml
• wscompile –gen –keep config.xml
Referencias
• Liberty, Jesse, Horvarth, David (200).
Aprendiendo C++ para Linux en 21 Días.
México, Prentice Hall.
• Márquez, Francisco (1994). Unix Programación
Avanzada. Estados Unidos, Addison-Wesley.
Referencias
• Colouris, George, Dollimore, Jean, Kindberg,
Tim (2001). Sistemas Distribuidos Conceptos y
Diseño. 3a. Edición. España, Pearson AddisonWesley.
• Horstmann, Cay, Cornell, Gary (2006). Core
Java 2 Volumen II Carácterísticas Avanzadas.
España, Perason Prentice Hall.
Referencias
• Deitel, Harvey, Deitel, Paul (2004). Java Como
Programar. Quinta Edición. México, Pearson
Prentice Hall.
• Márquez,
Francisco
Programación Avanzada.
México, Alfaomega Ra-Ma.
(2004).
Tercera
UNIX
edición,
Referencias
• Froufe, Agustín, Jorge, Patricia (2004). J2ME Java 2
Micro Edition Manual de usuario y tutorial. México,
Alfaomega.
• Firtman, Maximiliano (2004). Programación
celulares con Java. Argentina, MP Ediciones.
de
• Ruíz, Diego (2005). C# La guía total del programador.
Argentina, MP Ediciones.
Referencias
• Tanenbaum, Andrew (2002). Redes de
computadoras.
Cuarta
edición.
México,
Pearson.
• Wigley, Andy, Wheelwright, Stephen (2003).
Microsoft .NET Compact Framework. Estados
Unidos, Microsoft Press.
• Ferreira, R. (2009), Material del Curso de
Sistemas Distribuidos I, Instituto Tecnológico de
Morelia, México.
Referencias
• Makofsky, Steve (2004). Pocket PC Network
Programming. Estados Unidos, AddisonWesley.
• Wall, Kurt (2000). Programación en Linux.
Perú, Prentice Hall.
• Gregory, Kate (1999). Microsoft Visual C++ 6.
España, Prentice-Hall Que.
Referencias
• Tanenbaum,
Andrew
(1996).
Sistemas
Operativos Distribuidos. México, Prentice Hall.
• Tanenbaum, Andrew, Van Steen, Maarten
(2006). Distributed Systems Principles and
Paradigms. Estados Unidos, Pearson Prentice
Hall.
• Morales, F. (2009), Material del Curso de
Sistemas Distribuidos II, ITM, México.
Referencias
• Vázquez, Adolfo
Alfaomega Ra-Ma.
(2002).
XML.
México,
• R. Pressman, “Ingeniería del Software”, 5ª.
Edición, McGraw-Hiil, España, 2002.
• R. Johnsonbaug, Matemáticas Discretas, 4a.
Edición, Prentice Hall, México, 1999, ISBN:
970-17-0253-0.
Referencias
• R. Orfali, et al., “Cliente/servidor y objetos. Guía
de supervivencia”, tercera edición, Oxford
University Press, México, 2002, ISBN: 970-613597-9.
• W.
Inmor,
“Developing
Client/Sever
Applications”, Wiley, Estados Unidos, 2003,
ISBN: 0-471-56906-2.
Referencias
• D. Dewire, “Client/Server Computing”, McGrawHill, Estados Unidos, 1993, ISBN: 0-07-016732X.
• W. Marion, “Client/Server Strategies”, McGrawHill, Estados Unidos, 1994, ISBN: 0-07-0405395.
Referencias
• P. Renaud, “Introduction to Client/Server
Systems”, Wiley, Estados Unidos, 1993, ISBN:
0-471-57773-1.
• P. Kimmel, “Manual de UML. Guía de
aprendizaje”, McGraw-Hill, México, 2006, ISBN:
0-07-226182-X.
Referencias
• J. Senn, “Análisis y Diseño de Sistemas de
Información”, 2da. Edición, McGraw-Hill,
México, 1992, ISBN: 968-422-991-7.
• A. Tanenbaum, et al., “Sistemas Operativos.
Diseño e implementación”, 2da. Edición,
Prentice Hall, México, 1998, ISBN: 970-170165-8.
¿Preguntas, dudas y
comentarios?
Descargar

Sistemas Operativos II