lunes, 20 de julio de 2015

SOCKETS Y THREADS

SOCKETS

Los sockets son un mecanismo que nos permite establecer una acomunicación entre dos programas que se ejecutan independientes el uno del otro (generalmente un programa cliente y un programa servidor) Java por medio de la librería java.net nos provee dos clases: Socket para implementar la conexión desde el lado del cliente y ServerSocket que nos permitirá manipular la conexión desde el lado del servidor.


El servidor estará a la espera de una conexión, en cuanto el cliente inicie enviará un mensaje de petición al servidor, éste le responderá afirmativamente y una vez recibida la confirmación, el cliente enviará un par de mensajes y la conexión finalizará.


THREADS

En Java,  la principal estructura de ejecución de instrucciones es la estructura secuencial, en la que cada comando, cada línea, cada instrucción se ejecuta una después de otra.




En ocasiones puede que el usuario necesite llevar a cabo 2 o más procesos a la vez. Supongamos que queremos realizar 3 procesos al mismo tiempo, como el siguiente diagrama:

Como sabemo el procesador solo puede realizar una tarea a la vez, por o que no se puede tener un paralelismo entre los procesos ejecutandose, a menos que se tengan varios procesadores como tareas se requiera. Por eso se crearon los Threads, haciendo posible la multitarea nos permite ejecutar varios procesos a la vez; es decir, de forma concurrente y por tanto eso nos permite hacer programas que se ejecuten en menor tiempo y sean más eficientes. Con los hilos o threads, podemos obtener una ejecución lo más cercana posible al modelo de los 3 hilos que presenté arriba. Los threads son estructuras secuenciales que combinan las líneas de 2 o más procesos en un solo proceso.


SOCKET ECHO CLIENTE-SERVIDOR CONCURRENTE

Veremos una aplicación de la arquitectura servidor cliente, y la utilizacion de los hilos en java para eso crearemos 2 proyectos:
ConcurrentEcoServer: tiene las clases AppServidor y GestionClientes. 
ConcurrentEcoClient: tiene la clase AppCliente


Clase AppCliente

En la clase AppCliente lo que tenemos es el control de parametros de entrada, ya que los argumentos que recibe el cliente son el ip y el puerto a donde se va aconectar.



Luego se declaran las variables de entrada y de salida de datos por medio de las cuales se enviaran al servidor que esta escuchando las peticiones del cliente, cada que el cliente este mandando un mensaje el servidor lo repetira.



Se crea la conexión y el cliente pedirá el mensaje que va a enviar al servidor indefinidamente.



Cuando el cliente envie "salir" la conexion con el servidor se terminará y el servidor enviará un mensaje de confirmación, pero este seguirá escuchando mas peticiones.



Obviamente se trabajaran con excepciones.


Clase AppServidor

De la misma manera tenemos un control de parámetros de entrada, ya que el servidor tendrá que ingresar el puerto por donde va a escuchar.




Se crea el socket del servidor y se declara los parametros por donde el servidor va a recibir y enviar mensaje, con el acept() el servidor esta escuchando y luego creamos un objeto del tipo Thread que será nuestro nuevo hilo de ejecución y lo creamos con start().



Manejo de escepciones.


Clase GestionClientes

Esta clase hereda de la superclase Thread, el cual nos va a permitir crear hilos de ejecución. Primero tenemos como atributos un socket que será el del cliente que se conecte, el constructor inicializa al socket.



El metodo run es propio de la superclase y en ella se escriben las lineas de código que se ejecutará en el nuevo hilo de ejecución, asi cada vez que un cliente se conecte al servidor, este creará un hilo de ejecución para cada cliente, teniendo nuestro programa concurrente.




Manejo de escepciones.



Salida










Bibliografía

http://jarroba.com/multitarea-e-hilos-en-java-con-ejemplos-thread-runnable/
http://panamahitek.com/multiprocesos-en-java-como-usar-hilosthreads/
http://www.programarya.com/Cursos/Java-Avanzado/Sockets/

lunes, 29 de junio de 2015

SERIALIZACIÓN DE OBJETOS EN JAVA

SERIALIZACIÓN

La serialización de un objeto se utiliza para obtener una secuencia de bytes que represente el estado de un objeto, es decir el estado de sus campos. Podemos decir que serializar un objeto consiste en guardad elestado de sus campos.
Si el objeto a serializar tiene campos que a su vez son objetos, habrá que serializarlos primero, también se utiliza la serialización para poder reconstruir el objeto serializado. 

INTERFAZ SERIALIZABLE

Un objeto serializable es un objeto que se puede convertir en una secuencia de bytes. Para que un objeto pueda ser serializable, debe implementar la interfaz java.io.Serializable. Esta interfaz no implemeta ningún método, se usa para aquellas clases cuyas instancias
pueden ser convertidas a secuencias de bytes y tambieén ser reconstruídas. 


Flujos basados en bytes


Para la serialización de objetos:
„Clase ObjectOuputStream
Método - writeObject()
Ejemplo: flujoSalida.writeObjetct (objetoClase);
„ 
Para la deserialización de objetos:
Clase ObjectInputStream
Método - readObject()
Ejemplo: objetoClase = (Clase) flujoEntrada.readObject();

EJEMPLO

Consideremos el siguiente ejemplo, crearemos tres clases: Paciente, SerializarEscribir y SerializarLeer;

La clase Paciente va a implementar la interfaz Serializable:





En la clase SerializarEscribir lo que vamos a hacer es serializar un objeto de tipo ArrayList<Paciente> y lo vamos a escribir en un archivo llamado informacion.dat, creamos una objeto de la clase ObjectOuputStream ya que dentro de esta clase tenemos el método writeObject() que sirve para serializar el objeto.

Una vez que hayamos serializado el objeto y guadado, se crea el archivo informacion.dat el cual contiene el objeto listapacientes serializado


En la clase SerializarLeer lo que vamos a hacer es deserializar un objeto de tipo ArrayList<Paciente> que esta guardado en el archivo llamado informacion.dat, creamos una objeto de la clase ObjectInputStream ya que dentro de esta clase tenemos el método readObject() que sirve para deserializar el objeto, y luego lo guardamos en un nuevo ojbeto de tipo ArrayList<Paciente>.




Nuestra salida al mandar a imprimir el objeto lista pacientes es el siguiente:


Bibliografía



domingo, 21 de junio de 2015

EXCEPCIONES EN JAVA

Introducción

Dentro de la programación hay algo que casi siempre va a ocurrir y son los errores en los programas, el lenguaje de programación Java utiliza excepciones para permitir trabajar de una mejor manera con los errores. Los errores que se pueden clasificar de la siguente manera:

Errores de sintaxis: Ocurren en tiempo de diseño o codificación. 
Errores logicos: Ocurren cuando la logica en que se ha realizado un programa no es la deseada.
Errores del sistema: Estos pueden ser fatales y no fatales, estos ultimos son concidos como las excepciones y pueden sererrores como: división para cero, conversión de tipos, etc.

Los primeros lenguajes se empezaron a ver las necesidades de un sistema de tratamiento de errores asi es como se aparecen las excepciones, los lenguajes fueron evolucionando hasta tener sistemas gestores de excepciones con amplias posibilidades, La incorporación de sistemas de tratamiento de errores permitió dar un gran paso en la mejora de la respuesta de los programas ante excepciones que se había comprobado que eran inevitables. 

Concepto de excepción: Una excepción es un evento que ocurre durante la ejecución del programa que interrumpe el flujo normal de las sentencias

Uso de excepciones en Java

Cuando se produce un error en algún método, se lanza un objeto de tipo Throwable, cualquier método que llame a este,   puede capturar la excepción y tratarlo de la forma mas oportuna. Después de capturar la excepción, la ejecución del programa continua en el punto donde se haya capturado la excepción, y no vuelve al método en el que se produjo la excepción.   

Jerarquía de clases para el manejo de excepciones en Java



Throwable: Es la clase raiz que se encuentra en el paquete java.lang y representa aquellos que se puede lanzar en Java. contiene una instantanea del estado de la pila en el momento en el que se creó el objeto, tambien almacena un mensaje que detalla qué error se produjo, además de una causa que permite representar el error que causó este error.

Error: Es una subclase de Throwable, y nos indica problemas graves que una aplicación no debería intentar solucionar.

Exception: Sus subclases nos indican situaciones que una apliccación debería de tratar de forma razonable. las principales excepciones son:

  • RuntimeException: Son errores del programador (división para cero, acceso fuera de los límites de un array).
  • IOException: Son errores que no puede evitar el programador(relacionados con la E/S del programa).

¿Cómo crear sus propias excepciones?

Hay dos formas de tratar errores en Java: capturarlos o lanzarlos. Para el tratamiento de excepciones, Java necesita de un conjunto de palabras nuevas para tener en cuenta que cualquier código puede fallar o ser mal interpretado en tiempo de ejecución,  estas son try, catch y finally que corresponden a la captura de errores.

Bloques try - catch

Se utilizan para capturar las excepciones que se hayan podido producir en el bloque de código delimitado por try y catch, cuando se produce la excepción el bloque try termina su ejecucuón. 
La clausula catch recibe como argumento un objeto de tipo Throwable y estos pueden ser: Exception, dentro de este, ArithmeticException, NullPointerException,etc.



En la representación de un código empleando estos bloques si no hay ninguna excepción se ejecutarán los bloques: 1,2,5 en ese orden. 
Si existe una excepción de tipo aritmético se esecutarán los bloques 1,2*,3,5, y la excepción ocurrirá en bloque 2. 
Si se da otro tipo de excepción se ejecutarán los bloques 1,2*,4,5.  

Finally

Para que se ejecute un freagmento de código independientemente de si se produce una excepción o no usamos la cláusula finally.


Si no existe ninguna excepción se ejecutarán los bloques 1,2,4,5 de forma secuencial. 
Si existe una excepción de tipo aritmético se ejecutarán los bloque 1,2*,3,4,5 y si existe una excepción de otro tipo se ejecutarán los bloques 1,2*,4. 
Si el cuerpo del bloque try llega a comenzar su ejecución, el bloque finally siempre se ejecutará detrás del bloque try si no se producen excepciones, después de un bloque catch si éste captura una excepción, y justo después de que se produsca la excepción si el catch no captura la excepción y antes de que la excepción vaya hacia arriba.


BIBLIOGRAFIA


INTERFACES EN JAVA

¿Qué es una interface en Java?

Una interfaz en java se puede definir  como un conjunto de métodos abstractos y propiedades. En donde se indica que se debe hacer pero sin una implementación. Las clases que implementen estas interfaces describiran la lógica del comportamiento de todos los métodos de la interfaz. 

Una interfaz en Java define un tipo cuyos métodos están todos sin implementar esto es semejante a una herencia múltiple pero de clases abstractas en una clase. Cuando una clase implementa una interface, puede:

  • Implementar los métodos de la interface sobreescribiéndolos
  • No implementar los métodos de la interface: obligatoriamente será una clase abstracta y obligatoriamente ha de llevar la palabra clave abstract en su encabezado para así indicarlo.

Ventajas al utilizar interfaces:
  • Se organiza la programación.
  • Obligar a que ciertas clases utilicen los mismos métodos (nombres y parámetros)
  • Establecer relaciones entre clases que no estén relacionadas.


¿Cómo usar interfaces?

Para trabajar con interfaces, Java utiliza dos palabras reservadas: "interface" e "implements".
modificador_acceso interface NombreInterfaz { código de interfaz }                                       



El modificador de acceso permitido dentro de una interfaz es public o puede no existir.  Los atributos que definamos en el cuerpo de la interfaz deben ser atributos de tipo constante en las clases en las que se implemente.
Para implementar una interfaz en una clase se debe seguir el siguiente orden:

modificador_acceso NombreClase implements NombreInterfaz1 , NombreInterfaz2



Aplicaciones: Ordenación de colecciones de objetos.

Interfaz Comparable

Comparable es una Interfaz del paquete java.lang, esta interfaz nos define un método necesario a definir en nuestra clase para que se pueda implementar dicha interfaz.

Java contiene varios operadores de comparación (<, <=, >, >=, ==, !=) y nos permiten comparar valores primitivos, pero no se pueden utilizar estos operadores para comparar objetos. La interfaz Comparable se utiliza para permitir que los objetos de una clase que
implementa a la interfaz se comparen entre sí. Esta interfaz se utiliza comúnmente para ordenar objetos en una colección, como un arreglo.

Comparable <C> nos obliga a implementar el siguiente método: int compareTo(claseC objeto)


Lo que hace es comparar 2 objetos de la misma clase claseC y se devolver -1, 0 o 1 si el objeto que llama al método es respectivamente menor, igual o mayor que el objeto especificado en el método por objeto.

objecto1.comparteTo(objeto2);

                                             negativo si      objeto1 < objeto2
                                             cero si             objeto1 = objeto2
                                             positivo si        objeto1 > objeto2


Si un objeto es mayor o menor que otro es lo que tenemos que hacer nosotros. 
Las clases básicas del API de Java, como String, Integer, File, Date y demás, ya la implementan, con el orden esperado (alfabético, ordinal, cronológico, etc), así que solo tendremos que preocuparnos de este interface con nuestras clases propias que pueden ser complejas.

Clase Collections.

Esta clase que se encuentra e el paquete java.util se compone exclusivamente de los métodos estáticos que operan en o devuelven colecciones, esta clase tiene un método de ordenamiento de collecciones de elementos llamado Sort.

Método Sort


Ordena la lista especificada en orden ascendente, de acuerdo con el orden natural de sus elementos.


Este método es capaz de ordenar cualquier colección que implemente el interface java.util.Listjava.util.ArrayList y el orden natural lo indican el método comparteTo que revisamos antes.


EJEMPLOS

Crearemos una clase llamada Estudiante, una clase llamada Curso y una llamada Aplicación.
Como vemos la clase Estudiante implementa la interfaz Comparable


Por lo que tenemos que añadir el método compareto de Comparable, el cual implementaremos su código mas adelante.


Mientras que nuestra clase Curso tendrá como atributos un ArrayList de Estudiante



En nuestra clase Aplicación crearemos una nueva lista de Estudiantes y la añadiremos al array list de la clase Curso.



Para ordenar nuestra lista de estudiantes lo que debemos hacer el modificar nuestro método compareto de la clase Estudiantes según el parámetro deseado:

Para ordenar por el nombre:



Para ordenar por la edad:



Para ordenar por el IRA (indice de rendimiento académico):  



Mientras que en nuestra clase Aplicación utilizaremos el metodo sort de la clase Collections para ordenar de acuerdo al orden natural de sus elementos, es decir de manera en que hayamos modificado el método compareto.



Tendremos las siguentes salidas:

Ordenados alfabeticamente (por nombre): 


Ordenados cronologicamente (por edad):


Ordenados  ordinalmente (por IRA)


Codigo del ejercicio: https://www.dropbox.com/s/zdzbt4odrdq3izq/OrdenarClases.zip?dl=0


Interfaz Clonable


Una clase que implemente este interface le indica al método clone de la clase base Object que puede hacer una copia miembro a miembro de las instancias de dicha clase. Si una clase no implementa esta interface, e intenta hacer una duplicación del objeto a través de la llamada al método clone de la clase base Object, da como resultado una excepción del tipo CloneNotSupportedException

La clase base Object tiene un métodollamado clone, que se redefine en la clase derivada para realizar una duplicación de un objeto de dicha clase.
Para hacer una copia de un objeto de cualquier clase, se ha de seguir los siguentes pasos

  • Se ha de implementar el interface Cloneable
  • Se ha de redefinir el método clone de la clase base Object

EJEMPLOS

Crearemos una clase llamada Paciente y una llamada Aplicación.
Como vemos la clase Paciente implementa la interfaz Clonable

Para poder usar el método clone() se debe redefinir este metodo en la clase Paciente de la siguiente forma:


Si una clase que no implementa la interfaz Cloneable intenta hacer una duplicación del objeto a través de la llamada al método clone de la clase base Object, da como resultado una excepción del tipo CloneNotSupportedException.
En nuestra clase aplicación creamos un nuevo objeto de tipo Paciente y luego lo clonamos.


Se puede observar a la salida que son dos objetos con diferente dirección de memoria pero que tienen los mismos estados en sus atributos:






Bibliografia