lunes, 29 de mayo de 2017

Hilos JAVA

¿Qué son los Hilos en Java?

Los Hilos o los “Threads” en Java, son basicamente una forma de poder ejecutar varios procesos simultáneamente en nuestros programas en Java.
Usualmente para poder utilizarlos tenemos que crear clases que extienden a la clase Thread, y reescribir el metodo principal “run()”, el cual es el que se va a ejecutar principalmente al iniciar un hilo, thread o nuevo proceso en java.
Para comprender mejor el funcionamiento te proporciono el siguiente codigo fuente y un video donde explico como usar hilos de manera sencilla.

Se mostrará el código fuente para la realización de los hilos en java. 

A continuación se compartirá un programa de Funciones hecho en RMI e Hilos, donde se pone el ejemplo de un binario, factorial y primo: https://drive.google.com/drive/folders/0B9ixL_JgUUVJUk9TR0lTc0hqZXM?usp=sharing

Así como un chat en RMI Hilos: https://drive.google.com/drive/folders/0B9ixL_JgUUVJYXBaR183QU9KVDg?usp=sharing

RMI JAVA

¿Qué es el Remote Method Invocation ( RMI ) ?

Es un mecanismo ofrecido por Java para invocar un método de manera remota. Forma parte del entorno estándar de ejecución de Java y proporciona un mecanismo simple para la comunicación de servidores en aplicaciones distribuidas basadas exclusivamente en Java. Si se requiere comunicación entre otras tecnologías debe utilizarse CORBA o SOAP en lugar de RMI.
RMI se caracteriza por la facilidad de su uso en la programación por estar específicamente diseñado para Java; proporciona paso de objetos por referencia (no permitido por SOAP), recolección de basura distribuida (Garbage Collector distribuido) 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 dicho objeto estará accesible a través de la red y el programa permanece a la espera de peticiones en un puerto TCP. A partir de ese momento, un cliente puede conectarse 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 funcionalidad de serialización de Java).
  • Invocación del método (del cliente sobre el servidor). El invocador se queda esperando una respuesta.
  • Al terminar la ejecución, el servidor serializa el valor de retorno (si lo hay) y lo envía al cliente.
  • El código cliente recibe la respuesta y continúa como si la invocación hubiera sido local.

La arquitectura de RMI 

Primera capa

La primera capa es la de aplicación y se corresponde con la implementación real de las aplicaciones cliente y servidor. Aquí tienen lugar las llamadas a alto nivel para acceder y exportar objetos remotos. Cualquier aplicación que quiera que sus métodos estén disponibles para su acceso por clientes remotos debe declarar dichos métodos en una interfaz que extienda java.rmi.Remote. Dicha interfaz se usa básicamente para "marcar" un objeto como remotamente accesible. Una vez que los métodos han sido implementados, el objeto debe ser exportado. Esto puede hacerse de forma implícita si el objeto extiende la clase UnicastRemoteObject (paquete java.rmi.server), o puede hacerse de forma explí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úa directamente con la capa de aplicación. Todas las llamadas a objetos remotos y acciones 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 parte semántica de las invocaciones remotas. También es responsable de la gestión de la replicación de objetos y realización de tareas específicas de la implementación con los objetos remotos, como el establecimiento de las persistencias semánticas y estrategias adecuadas para la recuperación de conexiones perdidas. En esta capa se espera una conexión de tipo stream (stream-oriented connection) desde la capa de transporte.

Cuarta Capa[

La capa 4 es la de transporte. Es la responsable de realizar las conexiones necesarias y manejo del transporte de los datos de una máquina a otra. El protocolo de transporte subyacente para RMI es JRMP (Java Remote Method Protocol), 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 para hacerlos accesibles, y espera a que el cliente los invoque.
  • Un cliente, que obtiene una referencia a objetos remotos en el servidor, y los invoca.


A continuación se adjuntarán archivos ejemplo de lo que es la interfaz, el cliente y servidor en RMI Java basado en el libro de Computación Distribuida: https://drive.google.com/drive/folders/0B9ixL_JgUUVJNlVaell5bjUwR1k?usp=sharing


Sockets

¿Qué es un socket?
Un socket es un método para la comunicación entre un programa del cliente y un programa del servidor en una red, se define, por tanto, como el punto final en una conexión.
Tipos de socket
En la actualidad existen varios tipos de socket y cada uno por lo regular se asocia a un tipo de protocolo, por ejemplo:
Su principal ventaja radica en que son muy eficientes a la hora de enviar un número elevado de mensajes y datos.
Las propiedades de un socket dependen de las características del protocolo en el que se implementan. Generalmente la comunicación con sockets se realiza mediante un protocolo de la familia TCP/IP (Protocolo de Control de Transmisión/Protocolo de Internet). Los dos más utilizados son: TCP (Protocolo de Control de Transmisión) y UDP (Protocolo de Datagrama de Usuario)
Cuando se implementan con el protocolo TCP, los sockets tienen las siguientes propiedades:
El protocolo UDP es un protocolo no orientado a la conexión. Sólo se garantiza que si un mensaje llega, llegue bien. En ningún caso se garantiza que llegue o que lleguen todos los mensajes en el mismo orden que se mandaron. Esto lo hace adecuado para el envío de mensajes frecuentes pero no demasiado importantes, como por ejemplo, mensajes para los refrescos (actualizaciones) de un gráfico..
  • SOCK_STREAM: está asociado al protocolo TCP, este brinda seguridad en la transmisión de datos, seguridad en la recepción, en la integridad y en la secuencia, entre otros.
  • SOCK_DGRAM: está asociado al protocolo UDP, e indica que los paquetes viajarán en tipo datagramas, el cual tiene una comunicación asíncrona.

Ventajas


Propiedades inherentes a los sockets
  • Orientado a conexión.
  • Se garantiza la transmisión de todos los octetos sin errores ni omisiones.
  • Se garantiza que todo octeto llegará a su destino en el mismo orden en que se ha transmitido. Estas propiedades son muy importantes para garantizar la corrección de los programas que tratan la información.


    A continuación se adjuntarán los archivos de ejemplo de Sockets basado en el libro de Computación Distribuida que son orientados a conexión, en socket Stream y socket Datagrama: https://drive.google.com/drive/folders/0B9ixL_JgUUVJWGFVM3FVSmpicnM?usp=sharing
Fuente
  • Lenguajes y Ciencias de la Computación. Disponible en http://www.lcc.uma.es/~eat/services/i_socket/i_socket.html#link2.
  • Comunicacion entre procesos distribuidos. Disponible en http://es.tldp.org/Universitarios/seminario-2-sockets.html.
  • Sun. Programación en castellano. Disponible en http://programacion.com/java/tutorial/red/11/.
  • Ciencia e Ingeniería de la Computación. Programación en redes. Disponible en http://www.mcc.unam.mx/~cursos/Algoritmos/javaDC99-1/resumen2.html#TCP.