Aplicaciones Java.

22
República Bolivariana de Venezuela I.U.P “Santiago Mariño” Programación no Numérica II Ing. Diógenes Rodríguez Aplicaciones en Java Elaborado por: María Virginia Martínez 17.285.212 Sección: 1 A Ing. Sistemas Porlamar, 29, de Junio de 2013

Transcript of Aplicaciones Java.

República Bolivariana de VenezuelaI.U.P “Santiago Mariño”Programación no Numérica IIIng. Diógenes Rodríguez

Aplicaciones enJava

Elaborado por:

María Virginia Martínez17.285.212

Sección: 1 AIng. Sistemas

Porlamar, 29, de Junio de 2013

Introducción

Son muchas las aplicaciones que se pueden desarrollar mediante el lenguaje deprogramación Java, por ser un lenguaje orientado a objetos permite el uso deherencia, acoplamiento, encapsulamiento, etc., lo que hace posible el desarrollode diversas aplicaciones.

Se debe tener en cuenta que al desarrollar una aplicación es indispensablemanejar o al menos conocer las tareas básicas programables, como son el uso dearchivos, arrays, y por ende la lectura y escritura de los tipos de datos.

Como todo lenguaje de programación, Java hace uso de librerías y hay que aplicarciertas clases necesarias para la ejecución de los programas.

A continuación se hace referencia a una breve descripción de cómo trabajar coneste lenguaje, así como también, la introducción a otras aplicaciones que trabajanconjuntamente con java.

Entrada y salida de datos en java

Es un intercambio de datos entre el programa y el exterior. La entrada y salida enjava se implementa en el paquete java.io.

La E/S en java se basa en el concepto de flujo, que es una secuencia ordenada dedatos que tienen una fuente (flujos de entrada) o un destino (flujos de salida). Lasclases de E/S aíslan a los programadores de los detalles específicos del sistemade funcionamiento de la máquina, al tiempo que posibilitan el acceso a recursosdel sistema por medio de ficheros o archivos (files).

Entrada básica: la clase InputStream

La clase abstracta InputStream declara los métodos para leer datos desde unafuente concreta y es la clase base de la mayor parte de los flujos de entradaen java.io. Soporta los métodos siguientes:

int read() lee un sólo byte de datos y los devuelve en el rango [0..255].Devuelve -1 cuando se alcanza el final del flujo y no puede seguir leyendobytes.

int read(byte [] buf) lee un array de bytes hasta buf.length. Devuelve elnúmero de bytes leidos o -1 cuando se llega al final del flujo.

int read(byte [] buf, int off, int len) lee len bytes del flujo (o los que pueda)y los coloca a partir de la posición off del array.

long skip(long count) salta hasta count bytes de entrada o hasta el finaldel flujo de entrada, devolviendo el número de bytes saltados.

int available() devuelve el número de bytes que están disponibles paraleerse.

void close() cierra el flujo de entrada que abrió el constructor no-arg,liberando los recursos asociados a ese flujo. No es necesario invocar estemétodo ya que el flujo se cierra cuando se destruye el objeto aunque esconveniente hacerlo ya que vuelca el buffer sobre el disco.

Salida básica: la clase OutputStream

La clase abstracta OutputStream es análoga a InputStream sólo que proporcionamétodos para manejar el flujo de salida. Los métodos que incluye son:

void write(int b) escribe b como byte, que, aunque sea declaradocomo int es transformado a byte. Esto es porque habitualmente es elresultado de una operación previa.

void write(byte [] buf) escribe un array de bytes. void write(byte [] buf, int offset, int count) escribe un array buf de bytes,

empezando en la posición offset y escribiendo count de ellos, deteniéndoseantes si encuentra el final del array.

void flush() vacía el flujo de modo que los bytes que quedaran por escribirson escritos.

void close() cierra el flujo de salida liberando los recursos asociados a eseflujo.

A menos que se diga lo contrario estos métodos lanzan unaexcepción IOException si detectan algún error en el flujo de salida.

Salida con formato: la clase PrintStream

La clase PrintStream proporciona utilidades para dar formato a la salida. Tiene dosmétodos print y println que están sobrecargados para los tipos primitivos, objetos,cadenas y arrays de caracteres. La diferencia entre ambos métodos está enque println añade un carácter de nueva línea. Además el método println puedellamarse sin argumentos, produciendo una nueva línea.

System.out es una referencia a PrintStream. PrintStream proporciona dosconstructores, ambos con un primer argumento de tipo OutputStream cuyadiferencia está en un segundo argumento booleano que indica si debe vaciar elflujo con cada carácter de nueva línea.

Clases de lectura y escritura

Las jerarquías de clases

En el lenguaje Java los flujos de datos se describen mediante clases que formanjerarquías según sea el tipo de dato char Unicode de 16 bits o byte de 8 bits. A suvez, las clases se agrupan en jerarquías según sea su función de lectura o deescritura.

La característica de internacionalización del lenguaje Java es la razón por la queexiste una jerarquía separada de clases para la lectura y escritura de caracteres.

Todas estas clases se encuentran en el paquete java.io, por lo que al principio delcódigo fuente se deberá escribir la sentencia

import java.io.*;

char Unicode, 16 bits

byte, 8 bits.

Lectura

Las clases Reader e InputStream son similares aunque se refieren a distintos tiposde datos, lo mismo ocurre con Writer y OutputSream.

Por ejemplo, Reader proporciona tres métodos para leer un carácter char o unarray de caracteres

InputStream proporciona métodos similares para leer un byte o un array de bytes.

La primera versión lee un byte como entero del flujo de entrada, devuelve –1 si nohay más datos que leer. La segunda versión, lee un array de bytes devolviendo elnúmero de bytes leídos. La tercera versión, lee también, un array de bytes, peronos permite especificar, la posición de comienzo del array en la que se empiezana guardar los bytes, y el máximo número de bytes que se van a leer.

Escritura

La clase Writer proporciona tres métodos para escribir un carácter char o un arrayde caracteres

int read()

int read(char buf[])

int read(char buf[], int offset, int len)

int read()

int read(byte buf[])

int read(byte buf[], int offset, int len)

int write(int c)

int write(char buf[])

int write(char buf[], int offset, int len)

La clase OutputStream proporciona métodos similares

Entrada/Salida estándar

Aquí sólo se tratara la entrada/salida que se comunica con el usuario a través dela pantalla o de la ventana del terminal.

Si se crea una applet no se utilizarán normalmente estas funciones, ya que suresultado se mostrará en la ventana del terminal y no en la ventana de la applet.La ventana de la applet es una ventana gráfica y para poder realizar una entrada osalida a través de ella será necesario utilizar el AWT.

El acceso a la entrada y salida estándar es controlado por tres objetos que secrean automáticamente al iniciar la aplicación: System.in, System.out y System.err

System.in

Este objeto implementa la entrada estándar (normalmente el teclado). Losmétodos que proporciona para controlar la entrada son:

read(): Devuelve el carácter que se ha introducido por el teclado leyéndolodel buffer de entrada y lo elimina del buffer para que en la siguiente lecturasea leído el siguiente carácter. Si no se ha introducido ningún carácter porel teclado devuelve el valor -1.

skip(n): Ignora los n caracteres siguientes de la entrada.

System.out

Este objeto implementa la salida estándar. Los métodos que proporciona paracontrolar la salida son:

print(a): Imprime a en la salida, donde a puede ser cualquier tipo básicoJava, ya que Java hace su conversión automática a cadena.

int write(int c)

int write(byte buf[])

int write(byte buf[], int offset, int len)

println(a): Es idéntico a print(a) salvo que con println() se imprime un saltode línea al final de la impresión de a.

System.err

Este objeto implementa la salida en caso de error. Normalmente esta salida es lapantalla o la ventana del terminal como con System.out, pero puede serinteresante redirigirlo, por ejemplo hacia un fichero, para diferenciar claramenteambos tipos de salidas.

Las funciones que ofrece este objeto son idénticas a las proporcionadaspor System.out.

Entrada/Salida por fichero

Tipos de ficheros

En Java es posible utilizar dos tipos de ficheros (de texto o binarios) y dos tipos deacceso a los ficheros (secuencial o aleatorio).

Los ficheros de texto están compuestos de caracteres legibles, mientras que losbinarios pueden almacenar cualquier tipo de datos (int, float, boolean,...).

Una lectura secuencial implica tener que acceder a un elemento antes de accederal siguiente, es decir, de una manera lineal (sin saltos). Sin embargo los ficherosde acceso aleatorio permiten acceder a sus datos de una forma aleatoria, esto esindicando una determinada posición desde la que leer/escribir.

Clases a estudiar

En el paquete java.io existen varias clases de las cuales se pueden crearinstancias de clases para tratar todo tipo de ficheros.

Las tres principales son:

FileOutputStream: Fichero de salida de texto. Representa ficheros de textopara escritura a los que se accede de forma secuencial.

FileInputStream: Fichero de entrada de texto. Representa ficheros de textode sólo lectura a los que se accede de forma secuencial.

RandomAccessFile: Fichero de entrada o salida binario con accesoaleatorio. Es la base para crear los objetos de tipo fichero de accesoaleatorio. Estos ficheros permiten multitud de operaciones; saltar haciaadelante y hacia atrás para leer la información que sea necesaria en cada

momento, e incluso leer o escribir partes del fichero sin necesidad decerrarlo y volverlo a abrir en un modo distinto.

Generalidades

Para tratar con un fichero siempre hay que actuar de la misma manera:

Se abre el fichero.

Para ello hay que crear un objeto de la clase correspondiente al tipo de fichero quese va a manejar, y el tipo de acceso a utilizar:

Donde ruta es la ruta de disco en que se encuentra el fichero o un descriptor defichero válido.

Este formato es válido, excepto para los objetos de la clase RandomAccessFile(acceso aleatorio), para los que se ha de instanciar de la siguiente forma:

Donde modo es una cadena de texto que indica el modo en que se desea abrir elfichero; "r" para sólo lectura o "rw" para lectura y escritura.

Se utiliza el fichero.

Para ello cada clase presenta diferentes métodos de acceso para escribir o leer enel fichero.

Se puede observar que todos los métodos que utilicen clases de este paquetedeben tener en su definición una cláusula throws IOException. Los métodos deestas clases pueden lanzar excepciones de esta clase (o sus hijas) en eltranscurso de su ejecución, y dichas excepciones deben de ser capturadas ydebidamente gestionadas para evitar problemas.

Se cierra el fichero y se destruye el objeto.

Para cerrar un fichero lo que hay que hacer es destruir el objeto. Esto se puederealizar de dos formas, dejando que sea el recolector de basura de Java el que lodestruya cuando no lo necesite (no se recomienda) o destruyendo el objetoexplícitamente mediante el uso del procedimiento close() del objeto: obj.close()

TipoDeFichero obj = new TipoDeFichero( ruta );

RandomAccessFile obj = new RandomAccessFile( ruta,modo );

La clase FileOutputStream

Mediante los objetos de esta clase se escribe en ficheros de texto de formasecuencial.

Presenta el método write() para la escritura en el fichero. Presenta variosformatos:

int write( int c ): Escribe el carácter en el fichero.

int write( byte a[] ): Escribe el contenido del vector en el fichero.

int write( byte a[], int off, int len ): Escribe len caracteres del vector a en elfichero, comenzando desde la posición off.

El siguiente ejemplo crea el fichero de texto "/carta.txt" a partir de un texto que sele introduce por teclado:

La clase FileInputStream

Mediante los objetos de esta clase se lee de ficheros de texto de forma secuencial.

Presenta el método read() para la lectura del fichero. Este método se puedeinvocar de varias formas.

import java.io.*;

class CreaCarta {

public static void main(String args[]) throws IOException{

int c;

FileOutputStream f=new FileOutputStream("/carta.txt");

while( ( c=System.in.read() ) != -1 )

f.write( (char)c );

f.close();

}

}

int read(): Devuelve el siguiente carácter del fichero.

int read( byte a[] ): Llena el vector a con los caracteres leídos del fichero.Devuelve la longitud del vector que se ha llenado si se realizó con éxito o –1 si no había suficientes caracteres en el fichero para llenar el vector.

int read( byte a[], int off, int len ): Lee len caracteres del fichero,insertándolos en el vector a.

Todos ellos devuelven -1 si se ha llegado al final del fichero (momento decerrarle).

El siguiente ejemplo muestra el fichero de texto "/carta.txt" en pantalla:

La clase RandomAccessFile

Mediante los objetos de esta clase se utilizan ficheros binarios mediante unacceso aleatorio, tanto para lectura como para escritura. En estos ficheros hay uníndice que dice en qué posición del fichero se encuentran, y con el que se puedetrabajar para posicionarse en el fichero.

Métodos de escritura

La escritura del fichero se realiza con una función que depende el tipo de datosque se desee escribir.

import java.io.*;

class MuestraCarta {

public static void main(String args[]) throws IOException {

int c;

FileInputStream f=new FileInputStream("/carta.txt");

while( ( c=f.read() ) != -1 )

System.out.print( (char)c );

f.close();

}

}

void write( byte b[], int ini, int len ); Escribe len caracteres del vector b.

void write( int i ); Escribe la parte baja de i (un byte) en el flujo.

void writeBoolean( boolean b ); Escribe el boolean b como un byte.

void writeByte( int i ); Escribe i como un byte.

void writeBytes( String s ); Escribe la cadena s tratada como bytes, nocaracteres.

void writeChar( int i ); Escribe i como 1 byte.

void writeChars( String s ); Escribe la cadena s.

void writeDouble( double d ); Convierte d a long y le escribe como 8 bytes.

void writeFloat( float f ); Convierte f a entero y le escribe como 4 bytes.

void writeInt( int i ); Escribe i como 4 bytes.

void writeLong( long v ); Escribe v como 8 bytes.

void writeShort( int i ); Escribe i como 2 bytes.

void writeUTF( String s ); Escribe la cadena s utilizando la codificación UTF-8.

Los métodos que escriben números de más de un byte escriben el primero suparte alta.

Métodos de lectura

La lectura del fichero se realiza con una función que depende del tipo de datosque queremos leer.

boolean readBoolean(); Lee un byte y devuelve false si vale 0 o true sino.

byte readByte(); Lee y devuelve un byte.

char readChar(); Lee y devuelve un caracter.

double readDouble(); Lee 8 bytes, y devuelve un double.

float readFloat(); Lee 4 bytes, y devuelve un float.

void readFully( byte b[] ); Lee bytes del fichero y los almacena en unvector b.

void readFully( byte b[], int ini, int len ); Lee len bytes del fichero y losalmacena en un vector b.

int readInt(); Lee 4 bytes, y devuelve un int.

long readLong(); Lee 8 bytes, y devuelve un long.

short readShort(); Lee 2 bytes, y devuelve un short.

int readUnsignedByte(); Lee 1 byte, y devuelve un valor de 0 a 255.

int readUnsignedShort(); Lee 2 bytes, y devuelve un valor de 0 a 65535.

String readUTF(); Lee una cadena codificada con el formato UTF-8.

int skipBytes(int n); Salta n bytes del fichero.

Si no es posible la lectura devuelven –1.

Serializacion

Para que un programa java pueda convertir un objeto en un montón de bytes ypueda luego recuperarlo, el objeto necesita ser Serializable. Al poder convertir elobjeto a bytes, ese objeto se puede enviar a través de red, guardarlo en unfichero, y después reconstruirlo al otra lado de la red, leerlo del fichero.

Para que un objeto sea serializable basta con que implemente lainterfaz Serializable. Como la interfaz Serializable no tiene métodos, es muysencillo implementarla, basta con unimplements Serializable y nada más. Porejemplo, la clase Datos siguiente es Serializable y java sabe perfectamenteenviarla o recibirla por red, a través de socket o de rmi. También java sabeescribirla en un fichero o reconstruirla a partir del fichero.

public class Datos implements Serializable

{

public int a;

public String b;

public char c;

}

Si dentro de la clase hay atributos que son otras clases, éstos a su vez tambiéndeben ser Serializable. Por ejemplo

//Esta clase es Serializable porque implementa Serializable y todos sus camposson Serializable, incluido "Datos f;"

Lectura de un servidor web

La clase básica para esto es URL. Con ella se indica la dirección web del fichero yse establace la conexión.

public class DatoGordo implements Serializable

{

public int d;

public Integer e;

Datos f;

}

import java.net.URL;

import java.net.URLConnection;

...

try {

URL url = newURL("http://mas.lne.es/fotos/img/2007/10/62/203093470447035b9bc5a095.43783284-foto_verano.jpg"); URLConnection urlCon = url.openConnection();...

} catch (Exception e) {

...

}

Si no se sabe el tipo de fichero que tiene el enlace, se puede preguntar a laclase URLConnection. Desde luego, el tipo de fichero es totalmente anecdótico,puesto que el método aquí expuesto vale para cualquier tipo de fichero, incluidoslos html.

Para acceder al contenido y descargarlo en un fichero local, pedimosa URLConnection el getInputStream() y lo vamos leyendo y escribiendo en unfichero local hasta el final

// Esto saca por pantalla "image/jpeg"

System.out.println(urlCon.getContentType());

// acceso al contenido web

InputStream is = urlCon.getInputStream();

// Fichero en el que queremos guardar el contenido

FileOutputStream fos = new FileOutputStream("e:/foto.jpg");

// buffer para ir leyendo.

byte [] array = new byte[1000];

// Primera lectura y bucle hasta el final

int leido = is.read(array);

while (leido > 0) {

fos.write(array,0,leido);

leido=is.read(array);

}

// Cierre de conexion y fichero.

is.close();

fos.close();

Java Foundation Classes (JFC) y Java 2D

Las Java Foundation Classes (JFC, en castellano Clases Base Java) son unframework gráfico para construir interfaces gráficas de usuario portables basadasen Java. JFC se compone de Abstract Window Toolkit (AWT), Swing y Java 2D.Juntas, suministran una interfaz de usuario consistente para programas Java,tanto si el sistema de interfaz de usuario subyacente es Windows, Mac OSX o Linux.

AWT es la más antigua de las dos APIs de interfaz, y fue criticada duramente porser poco más que una envoltura alrededor de las capacidades gráficas nativas dela plataforma anfitrión. Esto significa que los widgets estándar en la AWT confíanen esas capacidades de los widgets nativos, requiriendo que el desarrolladortambién este prevenido de las diferencias entre plataformas anfitrión.

Una API de gráficos alternativa llamada Internet Foundation Classes fuedesarrollada en código más independiente de la plataforma por Netscape.Últimamente, Sun mezcló la IFC con otras tecnologías bajo el nombre "Swing",añadiendo la capacidad para un look and feel enchufable de los widgets. Estopermite a los programas Swing mantener la base del código independiente de laplataforma, pero imita el look de la aplicación nativa.

Java 2D

En computación, Java 2D es un API para dibujar gráficos en dos dimensionesusando el lenguaje de programación Java. Cada operación de dibujo Java 2Dpuede tratarse como rellenar una forma usando un pincel y componiendo elresultado en la pantalla.

Una forma en Java 2D es un límite infinitamente delgado el cual define un interiory un exterior. Los Píxeles internos de la forma están afectados por la operación dedibujo, los que están fuera no.

Java Media Framework (JMF)

JMF es una API que sirve para incluir multimedia en las aplicaciones de Java,funciona básicamente, recibiendo el contenido multimedia de alguna fuente, paradespués procesarlo y entregarlo en alguna salida multimedia.

La manera más sencilla de poner un reproductor en una applet es utilizando elMediaPlayer Bean.

Se instancia un Media Player, asi:

Para decirle al player que archivo se quiere reproducir se utilizala siguiente línea:

Para iniciar, detener o pausar la reproducción, se usan las siguientes líneasrespectivamente:

Java 3D

La API (Application Program Interface) Java3D es una interfaz de programaciónutilizada para realizar aplicaciones y applets con gráficos en tres dimensiones.Proporciona a los desarrolladores un alto nivel para crear y manipular objetosgeométrios 3D y para construir las estructuras utilizadas en el renderizado dedichos objetos. Se pueden describir grandes mundos virtuales utilizando estosconstructores, que proporcionan a Java3D la suficiente información para hacer unrenderizado de forma eficiente.

Algunos objetivos importantes de Java3D son:

Proporcionar un amplio conjunto de utilidades que permitan crear mundosen 3D interesantes.

Proporcionar un paradigma de programación orientado a objeto de alto nivelpara permitir a los desarrolladores generar sofisticadas aplicaciones yapplets de forma rápida.

Proporcionar soporte a cargadores en tiempo de ejecución. Esto permiteque Java3D se adapte a un gran número de formatos de ficheros, comopueden ser formatos específicos de distintos fabricantes de CAD, formatos

MediaPlayer player = new javax.media.bean.playerbean.MediaPlayer():

player.setMediaLocation(dirección del archivo);

player.start();

player.close();

player.stop();

de intercambio o VRML 1.0 (Virtual Reality Modelling Language) y VRML2.0.

Las aplicaciones en Java3D construyen los distintos elementos gráficos comoobjetos separados y los conectan unos con otros mediante una estructura enforma de árbol denominada grafo de escena. La aplicación manipula los diferentesobjetos utilizando los métodos de acceso, de modificación y de unión definidos ensu interfaz.

Java Beans

Los JavaBeans son un modelo de componentes creado por Sun Microsystemspara la construcción de aplicaciones en Java.

Se usan para encapsular varios objetos en un único objeto (la vaina o Bean eninglés), para hacer uso de un solo objeto en lugar de varios más simples.

La especificación de JavaBeans de Sun Microsystems los define como"componentes de software reutilizables que se puedan manipular visualmente enuna herramienta de construcción".

A pesar de haber muchas semejanzas, los JavaBeans no deben confundirse conlos Enterprise JavaBeans (EJB), una tecnología de componentes del lado servidorque es parte de Java EE.

Dentro de un JavaBean podemos distinguir tres partes:

Propiedades: Los atributos que contiene.

Métodos: Se establecen los métodos get y set para acceder y modificar losatributos.

Eventos: Permiten comunicar con otros JavaBeans.

Ejemplo

RMI

RMI (Java Remote Method Invocation) es un mecanismo ofrecido por Java parainvocar un método de manera remota. Forma parte del entorno estándar deejecución de Java y proporciona un mecanismo simple para la comunicación deservidores en aplicaciones distribuidas basadas exclusivamente en Java. Si serequiere comunicación entre otras tecnologías debe utilizarse CORBA o SOAP enlugar de RMI.

public class PersonaBean

implements java.io.Serializable {

private String nombre;

private int edad;

public PersonaBean() {

// Constructor sin argumentos

}

public void setNombre(String n) {

this.nombre = n;

}

public void setEdad(int e) {

this.edad = e;

}

public String getNombre() { return (this.nombre); }

public int getEdad() { return (this.edad); }

}

RMI se caracteriza por la facilidad de su uso en la programación por estarespecíficamente diseñado para Java; proporciona paso de objetos por referencia(no permitido por SOAP), recolección de basura distribuida (Garbage Collectordistribuido) y paso de tipos arbitrarios (funcionalidad no provista por CORBA).

A través de RMI, un programa Java puede exportar un objeto, con lo que dichoobjeto estará accesible a través de la red y el programa permanece a la espera depeticiones en un puerto TCP. A partir de ese momento, un cliente puedeconectarse e invocar los métodos proporcionados por el objeto.

La invocación se compone de los siguientes pasos:

Encapsulado (marshalling) de los parámetros (utilizando la funcionalidadde serialización de Java).

Invocación del método (del cliente sobre el servidor). El invocador se quedaesperando una respuesta.

Al terminar la ejecución, el servidor serializa el valor de retorno (si lo hay) ylo envía al cliente.

El código cliente recibe la respuesta y continúa como si la invocaciónhubiera sido local.

La arquitectura RMI puede verse como un modelo de cuatro capas.

Primera capa:

La primera capa es la de aplicación y se corresponde con la implementación realde las aplicaciones cliente y servidor. Aquí tienen lugar las llamadas a alto nivelpara acceder y exportar objetos remotos. Cualquier aplicación que quiera que susmétodos estén disponibles para su acceso por clientes remotos debe declarardichos métodos en una interfaz que extienda java.rmi.Remote. Dicha interfaz seusa básicamente para "marcar" un objeto como remotamente accesible. Una vezque los métodos han sido implementados, el objeto debe ser exportado. Estopuede hacerse de forma implícita si el objeto extiende la claseUnicastRemoteObject (paquete java.rmi.server), o puede hacerse de formaexplícita con una llamada al método exportObject() del mismo paquete.

Segunda capa:

La capa 2 es la capa proxy, o capa stub-skeleton. Esta capa es la que interactúadirectamente con la capa de aplicación. Todas las llamadas a objetos remotos yacciones junto con sus parámetros y retorno de objetos tienen lugar en esta capa.

Tercera capa:

La capa 3 es la de referencia remota, y es responsable del manejo de la partesemántica de las invocaciones remotas. También es responsable de la gestión dela replicación de objetos y realización de tareas específicas de la implementacióncon los objetos remotos, como el establecimiento de las persistencias semánticasy estrategias adecuadas para la recuperación de conexiones perdidas. En estacapa se espera una conexión de tipo stream (stream-oriented connection) desde lacapa de transporte.

Cuarta Capa:

La capa 4 es la de transporte. Es la responsable de realizar las conexionesnecesarias y manejo del transporte de los datos de una máquina a otra. Elprotocolo de transporte subyacente para RMI es JRMP (Java Remote MethodProtocol), que solamente es "comprendido" por programas Java.

Elementos

Toda aplicación RMI normalmente se descompone en 2 partes:

Un servidor, que crea algunos objetos remotos, crea referencias parahacerlos accesibles, y espera a que el cliente los invoque.

Un cliente, que obtiene una referencia a objetos remotos en el servidor, ylos invoca.

Java IDL

Java IDL o Java Interface Description Language es una implementación CORBAque permite que dos objetos interactúen sobre diferentes plataformas a través deuna red. Java IDL al ser una interfaz permite que los objetos interactúen sinimportar el lenguaje en que estén escritos, a diferencia de Java RMI que solosoporta objetos distribuidos escritos en Java.

Esto se logra ya que Java IDL está basado en Common Object RequestBrokerage Architecture (CORBA), un estándar para objetos distribuidos. CORBAfue definido y está controlado por el Object Management Group (OMG) que definelas APIs, el protocolo de comunicaciones y los mecanismos necesarios parapermitir la inter operatividad entre diferentes aplicaciones escritas en diferenteslenguajes y ejecutadas en diferentes plataformas, lo que es fundamental encomputación distribuida.

Para soportar la interacción entre objetos de programas separados, Java IDLproporciona un Object Request Broker (ORB) que es una biblioteca de clases que

permite una comunicación de bajo nivel entre aplicaciones Java IDL y aplicacionescompatibles con CORBA.

Java Native Interface (JNI)

Java Native Interface (JNI) es un framework de programación que permite que unprograma escrito en Java ejecutado en la máquina virtual java (JVM) puedainteractuar con programas escritos en otros lenguajes como C, C++ yensamblador.

El JNI se usa para escribir métodos nativos que permitan solventar situaciones enlas que una aplicación no puede ser enteramente escrita en Java, como porejemplo en el caso de que la biblioteca estándar de clases no proporcione soportepara funcionalidades dependientes de la plataforma.

También se usa para modificar programas existentes escritos en algún otrolenguaje, permitiéndoles ser accesibles desde aplicaciones Java. Muchas de lasclases de la API estándar de Java dependen del JNI para proporcionarfuncionalidad al desarrollador y al usuario, por ejemplo las funcionalidades desonido o lectura/escritura de ficheros. El desarrollador debe asegurarse que la APIestándar de Java no proporciona una determinada funcionalidad antes de recurriral JNI, ya que la primera ofrece una implementación segura e independiente de laplataforma.

El framework JNI permite a un método nativo utilizar los objetos Java de la mismaforma en que el propio código de Java lo hace. Un método nativo puede crearobjetos Java; y examinarlos y utilizarlos para que lleven a cabo su función. Unmétodo nativo puede asimismo examinar y utilizar objetos que han sido creadospor código de aplicación escrito en Java.

A menudo se denomina a JNI como la "válvula de escape" para desarrolladoresdado que les permite añadir funcionalidades a sus aplicaciones que el API de Javano puede proporcionar.

Dado que -como se ha dicho antes- puede ser usado para interactuar con códigoescrito en otros lenguajes como C++, también se usa para operaciones y cálculosde alta complejidad temporal, porque el código nativo es por lo general más rápidoque el que se ejecuta en una máquina virtual.