miércoles, 22 de julio de 2009

JDBC

JDBC(Java Database Connectivity)
Más conocida por sus siglas JDBC, es una API que permite la ejecución de operaciones sobre bases de datos desde el lenguaje de programación Java, independientemente del sistema operativo donde se ejecute o de la base de datos a la cual se accede, utilizando el dialecto SQL del modelo de base de datos que se utilice.

El API JDBC se presenta como una colección de interfaces Java y métodos de gestión de manejadores de conexión hacia cada modelo específico de base de datos. Un manejador de conexiones hacia un modelo de base de datos en particular es un conjunto de clases que implementan las interfaces Java y que utilizan los métodos de registro para declarar los tipos de localizadores a base de datos (URL) que pueden manejar. Para utilizar una base de datos particular, el usuario ejecuta su programa junto con la biblioteca de conexión apropiada al modelo de su base de datos, y accede a ella estableciendo una conexión, para ello provee el localizador a la base de datos y los parámetros de conexión específicos. A partir de allí puede realizar con cualquier tipo de tareas con la base de datos a las que tenga permiso: consulta, actualización, creación, modificación y borrado de tablas, ejecución de procedimientos almacenados en la base de datos, etc.

El objetivo de nuestro ejemplo es el de ver qué tenemos que hacer para crear una conexión sobre una base de datos y ejecutar una consulta.

Las tres clases que manejaremos en nuestro ejemplo serán Connection para realizar la conexión a la base de datos, PreparedStatement que será la que contenga la sentencia SQL y ResultSet que será la que contenga el resultado.

Lo primero que tenemos que saber para realizar la conexión a la base de datos es donde se encuentra dicha base de datos. Para hacer referencia a la base de datos lo podemos hacer directamente mediante la IP o, por ejemplo, mediante una referencia ODBC.

Así, podríamos tener referencias como:

jdbc:db2:10.0.1.10:50000/BD1 (referencia directa)
jdbc:odbc:BD1 (referencia por ODBC)

Una vez conocemos la localización de nuestra base de datos debemos de saber el nombre de la clase que tiene implementada la conexión a la base de datos. Es lo que llamamos driver. Dependiendo de la forma en la que este implementado el driver, este, recibirá el apelativo de driver tipo1, tipo2, tipo3 o tipo4.

Si nos ponemos a escribir código, lo primero que debemos de hacer es instanciar la clase del driver.

Class.forName(sDriver).newInstance();

Dicha clase será la que nos proporcione una conexión a la base de datos, y como bien hemos dicho, la conexión la guardaremos en una instancia de la clase Connection.

con = DriverManager.getConnection(sURL);

Un vez que hemos conseguido una conexión a la base de datos lo siguiente será el preparar una sentencia SQL en un PreparedStatement. No haremos nada complicado con el SQL, algo así como...

stmt = con.prepareStatement("SELECT deporte FROM deportes");

Construida nuestra sentencia, realizamos la ejecución de la misma. Y el resultado al ResultSet.

rs = stmt.executeQuery();

Un ResultSet no deja de ser una especie de matriz (filas x columnas) que deberemos de recorrer mediante el movimiento de un cursor. Y la forma más fácil en Java es mediante un bucle while. Y para acceder a las columnas bastará con utilizar los métodos getXXX del ResultSet: getString() para las cadenas de texto, getDouble() para los decimales, getDate() para las fechas,......

while (rs.next())
System.out.println (rs.getString("deporte"));

Una vez que hemos finalizado el cometido de nuestro ejercicio deberemos de cerrar las conexiones a la base de datos. Para ello invocaremos el método close() sobre los tres objetos mencionados.

Y en todo este proceso, las excepciones. No nos debemos de olvidar de ellas. A tal respecto deberemos de ejecutar nuestro código en un bloque try-catch que controle la SQLException. Excepción común que se produce en el acceso a la base de datos.



Chat (Sockets)

Codigo cliente servidor:

SERVIDOR


servidor.java

aplicacion servidora del chat simple desarrollado en java.
compilar con :
javac servidor.java
ejecutar con :
java servidor


// Librerias Necesarias
import java.awt.*; // modo grafico
import java.io.*; // entrada/salida
import java.net.*; // funciones de red

public class servidor extends Frame {

// elementos de la ventana
static Button enviar = new Button("Enviar");
static Button cerrar = new Button("Cerrar");
static TextArea texto = new TextArea(10,40);
static TextField mensaje = new TextField(40);

// Componentes de la comunicacion
static ServerSocket servido; // socket servidor
static Socket cliente; // socket para manejar los clientes
static String mensa = "";
static PrintStream ps; // flujo de salida
static DataInputStream datos; // flujo de entrada

// funcion principal
public static void main( String args[]) {

// crear instancia ventana
new servidor();

// crear socket servidor en el puerto 5000
// se puede cambiar a nuestro gusto
try{
servido = new ServerSocket(5000);
// error al crear el servidor
}catch (IOException e) {
System.out.println("Error al crear el Socket Servidor");
System.exit(1);
};

// ciclo para el tratamiento de los clientes
do{
try{

texto.append("Esperando Cliente ...\n");

//esperar cliente
cliente = servido.accept();
activar();
texto.append("Llego un cliente. Respondele ...\n");

// inicializacion de las estructuras para la lectura/escritura
// con los datos del cliente
ps = new PrintStream(cliente.getOutputStream());
datos = new DataInputStream(cliente.getInputStream());

// ciclo de recepcion de mensajes
while((mensa = datos.readLine()) != null){
texto.append("Cliente dice : "+mensa+"\n");
};

texto.append("\nTerminando la conexion con el cliente.\n");
cerrarconexion();
texto.append("\nEl cliente se ha desconectado.\n");

}catch (IOException e) {
texto.append("Error de Lectura / Escritura en los Sockets\n");
desactivar();
};
}while(true); // ciclo infinito. se desconecta un cliente y esperamos
// otro. para salir debemos dar click en el boton cerrar
}

// funcion que grafica
public servidor() {

// titulo de la ventana
setTitle("Java Chat Servidor");

// elementos de la ventana
Panel pan = new Panel();
pan.add(enviar);
pan.add(cerrar);

Panel pan1 = new Panel();
pan1.add(mensaje);

Panel pan2 = new Panel();
pan2.add(texto);

add("North",pan2);
add("Center",pan1);
add("South",pan);

enviar.disable();
texto.disable();
mensaje.disable();

// tama¤o constante
setResizable(false);

// organizar y mostrar
pack();
show();
}

public boolean action(Event ev, Object arg) {

// eventos en los botones

// click en el boton cerrar
if((ev.target == cerrar)&&(ev.id == 1001)){
cerrarconexion();
System.exit(0);
}
// click en el boton enviar
if((ev.target == enviar)&&(ev.id == 1001)){
if(!mensaje.getText().equals("")){
ps.println(mensaje.getText());
texto.append("Servidor dice : "+mensaje.getText()+"\n");
mensaje.setText("");
}
}
return(true);
}

// esta funcion habilita los elementos de la ventana
public static void activar(){
enviar.enable();
mensaje.enable();
}

// esta funcion deshabilita los elementos de la ventana
public static void desactivar(){
enviar.disable();
mensaje.disable();
}

// funcion que cierra la conexion con el cliente
public static void cerrarconexion(){
try{
cliente.close();
}catch(IOException e){
texto.append("Error al cerrar el cliente");
};
desactivar();
}
}


CLIENTE

cliente.java


aplicacion cliente del chat simple desarrollado en java.
compilar con :
javac cliente.java
ejecutar con :
java cliente [direccion ip o nombre del equipo servidor]


// Librerias Necesarias
import java.awt.*; // modo grafico
import java.io.*; // entrada/salida
import java.net.*; // funciones de red

public class cliente extends Frame {

// elementos de la ventana
static Button enviar = new Button("Enviar");
static Button cerrar = new Button("Cerrar");
static TextArea texto = new TextArea(10,40);
static TextField mensaje = new TextField(40);

// Componentes de la comunicacion
static Socket servidor; // socket servidor
static InetAddress direccion; // direccion del servidor
static String mensa = "";
static PrintStream ps; // flujo de salida
static DataInputStream datos; // flujo de entrada

// funcion principal
public static void main( String args[]) {

//crear instancia ventana
new cliente();

//crear socket cliente relacionado con el servidor
try{
direccion = getdir(args); // llamada a getdirs()
servidor = new Socket(direccion, 5000); // creacion del socket servidor
activar();

// inicializar el flujo de salida con los datos del servidor
ps = new PrintStream(servidor.getOutputStream());
// inicializar el flujo de entrada
datos = new DataInputStream(servidor.getInputStream());

texto.append("Conectado con el servidor ...\n");

// ciclo de recepcion de mensajes
while((mensa = datos.readLine()) != null){
texto.append("Servidor dice : "+mensa+"\n");
};

texto.append("Desconectado del servidor ...\n");
cerrarconexion();
desactivar();

}catch (IOException e) { // en caso de error de entrada/salida
System.out.println("Error al conectar con el servidor");
System.exit(1);
};
}

// funcion que grafica
public cliente() {

// titulo de la ventana
setTitle("Java Chat Cliente");

// elementos de la ventana
Panel pan = new Panel();
pan.add(enviar);
pan.add(cerrar);

Panel pan1 = new Panel();
pan1.add(mensaje);

Panel pan2 = new Panel();
pan2.add(texto);

add("North",pan2);
add("Center",pan1);
add("South",pan);

enviar.disable();
texto.disable();
mensaje.disable();

// tama¤o constante
setResizable(false);

// organizar y mostrar
pack();
show();
}
public boolean action(Event ev, Object arg) {

// eventos en los botones

// click en el boton cerrar
if((ev.target == cerrar)&&(ev.id == 1001)){
cerrarconexion();
System.exit(0);
}

// click en el boton enviar
if((ev.target == enviar)&&(ev.id == 1001)){
if(!mensaje.getText().equals("")){
ps.println(mensaje.getText()); // enviar el contenido de texto
texto.append("Cliente dice : "+mensaje.getText()+"\n");
mensaje.setText("");
}
}
return(true);
}

// esta funcion habilita los elementos de la ventana
public static void activar(){
enviar.enable();
mensaje.enable();
}

// esta funcion deshabilita los elementos de la ventana
public static void desactivar(){
enviar.disable();
mensaje.disable();
}

// funcion que convierte la direccion ip o el nombre del equipo donde esta
// corriendo el socket servidor que se pasa como parametro al programa
public static InetAddress getdir(String ar[]){
InetAddress tem = null;
try{
// si no hay argumentos tomar localhost
if(ar.length == 0){
tem = InetAddress.getLocalHost();
}
// si hay convertirla de string a inetaddress
if(ar.length == 1){
tem = InetAddress.getByName(ar[0]);
}
// error en la direccion
}catch(UnknownHostException e){
texto.append("Error en la direccion.");
}
return(tem);
}

// funcion que cierra la conexion con el servidor
public static void cerrarconexion(){
try{
servidor.close();
}catch(IOException e){
texto.append("Error al cerrar el cliente");
};
desactivar();
}
}


SMTP (Simple Mail Transfer Protocol)

Simple Mail Transfer Protocol

Un servidor de correo es una aplicación informática que nos permite enviar mensajes correos de unos usuarios a otros, con independencia de la red que dichos usuarios estén utilizando. Entre los más usados se encuentran Postfix, sendmail y Exim. Este último predeterminado en la distribución GNU/Linux Debian

Para lograr la conexión se definen una serie de protocolos, cada uno con una finalidad concreta:

  • SMTP, Simple Mail Transfer Protocol: Es el protocolo que se utiliza para que dos servidores de correo intercambien mensajes.
  • POP, Post Office Protocol: Se utiliza para obtener los mensajes guardados en el servidor y pasárselos al usuario.
  • IMAP, Internet Message Access Protocol: Su finalidad es la misma que la de POP, pero el funcionamiento y las funcionalidades que ofrecen son diferentes.

Así pues, un servidor de correo consta en realidad de dos servidores: un servidor SMTP que será el encargado de enviar y recibir mensajes, y un servidor POP/IMAP que será el que permita a los usuarios obtener sus mensajes.

Para obtener los mensajes del servidor, los usuarios se sirven de clientes, es decir, programas que implementan un protocolo POP/IMAP. En algunas ocasiones el cliente se ejecuta en la máquina del usuario (como el caso de Mozilla Thunderbird, Evolution, Microsoft Outlook). Sin embargo existe otra posibilidad: que el cliente de correo no se ejecute en la máquina del usuario; es el caso de los clientes vía web, como GMail, Hotmail, OpenWebmail, SquirrelMailTerra. En ellos la arquitectura del servicio es más compleja: o

En una máquina (A) tenemos el servidor SMTP y el servidor POP/IMAP. En otra (B) tenemos un servidor web con una aplicación cliente POP/IMAP. El usuario conecta vía WEB con (B) y entonces el cliente POP/IMAP establece una conexión POP/IMAP con el servidor de la máquina A; éste servidor le devuelve a B los mensajes del usuario, y una vez recibidos, el cliente genera una página web con los mensajes recibidos. La página web se pasa al servidor web que será el que la envíe al explorador web del usuario.

En cualquier caso, los protocolos SMTP/POP/IMAP son inseguros en cuanto a que los mensajes viajan en claro por la red, es decir, es fácil obtener nuestros mensajes y contraseñas. Para ello se suele añadir una capa SSL, es decir, un método de cifrado que puedan implementar tanto el servidor como el cliente. En el caso del correo vía web se pueden utilizar dos capas SSL: una entre A y B y otra entre el servidor web de B y el navegador web del usuario.

Funcionamiento:

SMTP se basa en el modelo cliente-servidor, donde un cliente envía un mensaje a uno o varios receptores. La comunicación entre el cliente y el servidor consiste enteramente en líneas de texto compuestas por caracteres ASCII. El tamaño máximo permitido para estas líneas es de 1000 caracteres.

Las respuestas del servidor constan de un código numérico de tres digitos, seguido de un texto explicativo. El número va dirigido a un procesado automático de la respuesta por autómata, mientras que el texto permite que un humano interprete la respuesta. En el protocolo SMTP todas las órdenes, réplicas o datos son líneas de texto, delimitadas por el carácter . Todas las réplicas tienen un código numérico al comienzo de la línea.

En el conjunto de protocolos TCP/IP, el SMTP va por encima del TCP, usando normalmente el puerto 25 en el servidor para establecer la conexión.

|

RMI

RMI (Java Remote Method Invocation) 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 provee de 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). Por medio de RMI, un programa Java puede exportar un objeto, lo que significa que éste queda accesible a través de la red y el programa permanece a la espera de peticiones en un puerto TCP. A partir de este momento, un cliente puede conectarse e invocar los métodos proporcionados por el objeto.

En rmi intervienen dos programas java que están ejecutándose en el mismo ordenador o en distintos ordenadores.

Uno de ellos, llamado servidor, "publica" algunas de los objetos/clases que tiene instanciadas. Publicarlos es equivalente a decir que los pone visibles desde la red, de forma que otros programas java puedan llamar a sus métodos.

El otro programa, llamado cliente, localiza en el servidor el objeto publicado y llama a sus métodos. Estos métodos se ejecutan en el programa servidor y devuelven un resultado (por el return habitual) que recoge el cliente en su ordenador.

El cliente se queda "colgado" en la llamada hasta que el servidor termina de ejecutar el código y devuelve un resultado.


Objetos remotos:

Los objetos que comparte el serivdor suelen conocerse como objetos remotos. Para hacer un objeto remoto, debemos hacer dos cosas. Primero una interface con los métodos que queremos que se publiquen, es decir, los métodos que queremos que pueda llamar el cliente. Esta interface debe a su vez heredar de la interface Remote. Todos los métodos de esta interface deben lanzar una RemoteException

public interface InterfaceRemota extends java.rmi.Remote
{
    public int suma (int a, int b) throws java.rmi.RemoteException;
}

Luego, debemos hacer el objeto remoto que implemente esta interface. Para evitarnos código, lo mejor es hacer que este objeto remoto herede a su vez de UnicastRemoteObject. Si lo hacemos así, nos obliga a crear un constructor que lanze una RemoteException.

public class ObjetoRemoto extends java.rmi.server.UnicastRemoteObject implements InterfaceRemota 
{
    public ObjetoRemoto() throws java.rmi.RemoteException 
    {
        super();
    }
 
    public int suma(int a, int b) 
    {
        System.out.println ("sumando "+a+"+"+b + " ...");
        return a+b;
    }
    
}

El objeto remoto se compila de la forma habitual, pero una vez que tenemos el fichero .class, necesitamos pasarle el compilador rmic que viene con java (esta en $JAVA_HOME/bin)

rmic paquete.ObjetoRemoto

No es necesario indicar el .class. Este compilador nos generará un fichero ObjetoRemoto_Stub.class. Esta es la clase que realmente verán los clientes. Es una clase generada automáticamente por java que tiene los mismos métodos que InterfaceRemota, pero que el código en estos métodos simplemente lanza la petición por red al ObjetoRemoto real que está en el servidor y recoge el resultado.

El código en el servidor de rmi

En el servidor de rmi el código que hay realizar es bastante sencillo. Simplemente instanciar el ObjetoRemoto y hacer una llamada a un método de la clase Naming para publicarlo.

try 
{
   ObjetoRemoto objetoRemoto = new ObjetoRemoto();
   Naming.rebind ("ObjetoRemoto", objetoRemoto);
} cacth (Exception e)
{
...
}

Antes de lanzar el servidor, en una ventana aparte, debemos lanzar un programa llamaado rmiregistry que también viene con java (esta en $JAVA_HOME/bin). Este programa es el que realmente sabe todos los objetos que se publican en este ordenador. La llamada Naming.rebind() en realidad conecta con rmiregistry en este ordenador y le avisa que ObjetoRemoto debe publicarse al exterior.

rmiregistry necesita encontrar la clase ObjetoRemoto_Stub.class, así que en el servidor debemos fijar la propiedad java.rmi.server.codebase con el path, en formato url, desde el que rmiregistry puede acceder a esta clase. Esto se puede hacer bien al arrancar el servidor por medio de la opción -D

java -Djava.rmi.server.codebase=file:/un_path/ Servidor

o bien desde código, antes de registrar el objeto remoto

System.setProperty("java.rmi.server.codebase", "file:/un_path/");

Es importante la barra del final, si no, no funciona. También, si hacemos esta clase accesible desde un servidor web, podemos usar algo estilo "http://servidor_web/un_path".

Una nota sobre seguridad en el servidor

En otros tutoriales se ven cosas como arrancar un RMISecurityManager y escribir un fichero java.policy de permisos. Normalmente hacer eso sin saber (y en concreto como lo ponen en muchos tutoriales) es peligroso por lo siguiente:

  • Si no instalamos el RMISecurityManager, tenemos una seguridad por defecto que es bastante restrictiva. Si no sabemos, es mejor dejar la de defecto.
  • Si instalamos el RMISecurityManager, estamos habilitando una cosa llamada carga dinámica de clases. La carga dinámica de clases consiste en que un cliente pueda enviarnos una clase hecha por él y que no esté en el servidor. Esa clase puede tener código malicioso.
  • Si instalamos el RMISecurityManager, las clases tanto del servidor como las cargadas dinámicamente de los clientes, tienen permiso para hacer aquellas cosas que se les permite en el fichero java.policy. Es decir, el fichero java.policy dice si una clase concreta tiene o no permisos para escribir o leer en disco duro, establecer sockets, etc. En muchos tutoriales, para evitar problemas en el ejemplo y no extenderse en explicaciones, ponen el fichero java.policy con todos los permisos para todo el mundo. Cualquier clase que venga de un cliente podría borrarnos el disco duro.

Por ello, mi consejo es simplemente que no pongas RMISecurityManager, salvo que necesites carga dinámica de clases. En ese caso, no dejes el fichero java.policy con todos los permisos para todo el mundo.

El código del cliente rmi.

El código del cliente rmi también es simple. No tiene más que pedir la clase al servidor y guardársela. Luego puede usarla como otra clase cualquiera.

InterfaceRemota objetoRemoto = (InterfaceRemota)Naming.lookup ("//IP_del_Servidor/ObjetoRemoto");
System.out.print ("2 + 3 = ");
System.out.println (objetoRemoto.suma(2, 3));

En el cliente también se puede poner RMISecurityManager y java.policy con las mismas consideraciones anteriores.

El compilado se hace de forma normal. Para compilar necesitaremos el fichero InterfaceRemota.class. Si no hemos puesto RMISecurityManager, necesitarmos los ficheros InterfaceRemota.class y ObjetoRemoto_Stub.class para ejecutar.

MySql

MySQL

Es un sistema de gestión de base de datos relacional, multihilo y multiusuario con más de seis millones de instalaciones.[1] MySQL AB —desde enero de 2008 una subsidiaria de Sun Microsystems y ésta a su vez de Oracle Corporation desde abril de 2009— desarrolla MySQL como software libre en un esquema d
e licenciamiento dual. Por un lado se ofrece bajo la GNU GPL para cualquier uso compatible con esta licencia, pero para aquellas empresas que quieran incorporarlo en productos privativos deben comprar a la empresa una licencia específica que les permita este uso. Está desarrollado en su mayor parte en ANSI C. Al contrario de proyectos como Apache, donde el software es desarrollado por una comunidad pública y el copyright del código está en poder del autor individual, MySQL es propietario y está patrocinado por una empresa privada, que posee el copyright de la mayor parte del código. Historia del proyecto SQL (Lenguaje de Consulta Estructurado) fue comercializado por primera vez en 1981 por IBM, el cual fue presentado a ANSI y desde entonces ha sido considerado como un estándar para las bases de datos relacionales. Desde 1986, el estándar SQL ha aparecido en diferentes versiones como por ejemplo: SQL:92, SQL:99, SQL:2003. MySQL es una idea originaria de la empresa opensource MySQL AB establecida inicialmente en Suecia en 1995 y cuyos fundadores son David Axmark, Allan Larsson, y Michael "Monty" Widenius. El objetivo que persigue esta empresa consiste en que MySQL cumpla el estándar SQL, pero sin sacrificar velocidad, fiabilidad o usabilidad. Michael Widenius en la década de los 90 trató de usar mSQL para conectar las tablas usando rutinas de bajo nivel ISAM, sin embargo, mSQL no era rápido y flexible para sus necesidades. Esto lo llevó a crear una API SQL denominada MySQL para bases de datos muy similar a la de mSQL pero más portable. La procedencia del nombre de MySQL no es clara. Desde hace más de 10 años, las herramientas han mantenido el prefijo My. También, se cree que tiene relación con el nombre de la hija del cofundador Monty Widenius quien se llama My. Por otro lado, el nombre del delfín de MySQL es Sakila y fue seleccionado por los fundadores de MySQL AB en el concurso “Name the Dolphin”. Este nombre fue enviado por Ambrose Twebaze, un desarrollador de Open source Africano, derivado del idioma SiSwate, el idioma local de Swazilandia y corresponde al nombre de una ciudad en Arusha, Tanzania, cerca de Uganda la ciudad origen de Ambrose.

Corba

CORBA: es una especificación la cual define una infraestructura para la arquitectura OMA (Object Management Arquitecture) de OMG(Object Management Group), especificando los estándares necesarios para, la invocación de métodos sobre objetos en entornos heterogéneos.

La OMG es fundada en 1989, por American Airlines, Canon, Data General, HP, Philips Telecomunicaciones, Sun , 3Com y Unisys.
Las implementaciones de Corba son conocidas como ORB (Object Common Broker).
Los entornos heterogéneos son aquellos en los que las arquitecturas que constituyen el entorno pueden ser sistemas Microsoft Windows, nix de diferentes fabricantes, MacOS o OS/2. Y es más, dentro de la heterogeneidad también se incluyen los sistemas de comunicaciones (protocolos de comunicación como TCP/IP, IPX ...) o los lenguajes de programación utilizados en las diferentes arquitecturas.


CORBA define su propio modelo de objetos, basado en la definición de las interfaces de los objetos mediante el lenguaje IDL.

De esta forma se logra una abstracción de la heterogeneidad que permite que el uso de CORBA no sea nada complejo. CORBA sigue una metodología concreta y fácil de seguir.

CORBA ha logrado parte de su éxito a la clara separación entre la
interfaz de los objetos y la implementación de los mismos. Las interfaces se definen utilizando el lenguaje IDL, cuya principal característica es su alto nivel de abstracción, lo que le separa de cualquier entorno de desarrollo específico. Para la implementación
de los objetos se puede utilizar cualquier lenguaje de programación que proporcione enlaces con el lenguaje IDL.
Para que un lenguaje de programación se pueda utilizar desde CORBA,
debe tener definida la forma de enlazarse con IDL.

De esta forma, y a partir de una especificación de las interfaces en IDL, se generan unos cabos (proxies) en el lenguaje elegido que permiten el acceso a la implementación de los objetos desde la arquitectura CORBA.

CORBA es un estándar creado con la idea de una distribución de los sistemas basada en objetos. Con CORBA se pretende definir una arquitectura que especifique cómo se crean los objetos y cómo se accede a sus funcionalidades.

DCOM (Distributed Component Object Model), el Modelo de Objeto Componente Distribuido, es un juego de conceptos e interfaces de programa de Microsoft en el cual los objetos de programa del cliente pueden solicitar servicios de objetos de programa servidores en otros ordenadores dentro de una red. El modelo de Objeto Componente (COM) proporciona un juego de interfaces que permiten a los clientes y servidores comunicarse dentro del mismo ordenador (si están corriendo bajo un sistema Windows 95 o NT).
Por ejemplo, uno puede crear una página para un sitio web que contenga un script o programa que puede ser procesado (antes de ser enviado a otro
usuario que lo solicite) no en el servidor del sitio web, sino en otro servidor más especializado de la red. Usando interfaces DCOM, el servidor del programa del sitio web (actuando ahora como un objeto cliente) puede iniciar una Llamada de Procedimiento Remoto (Remote Procedure Call, RPC) al objeto del servidor especializado, que proporciona el procesamiento necesario y devuelve el resultado al servidor del sitio web. ƒste pasa el resultado al usuario que está viendo la página web.
El DCOM también puede funcionar dentro de una empresa o en redes distintas de la Internet pública. Usa protocolos TCP/IP y HTTP. El DCOM viene como parte de NT 4.0 y es una actualización gratuita para Windows 95. El DCOM está ya, o pronto lo estará, disponible en todas las principales plataformas UNIX y en los productos de servidores grandes de IBM. El DCOM reemplaza la Automatización Remota del OLE (OLE Remote Automation).
El DCOM es en lo general equivalente a una Arquitectura de Intermediación de Solicitud de Objetos Comunes (Common Object Request Broker Architectu
re, CORBA) por cuanto proporciona un juego de servicios distribuidos. El DCOM es la aproximación de Microsoft a un ambiente de programas y objetos de datos para toda una red. La CORBA es patrocinada por el resto de industria de tecnología de la información bajo los auspicios del Grupo de Administración de Objetos (Object Management Group OMG).





CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar las interfaces con los servicios que los objetos ofrecerán. CORBA puede especificar a partir de este IDL, la interfaz a un lenguaje determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en las implementaciones del cliente y del servidor. Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java, Python, Perl y Tcl. Al compilar una interfaz en IDL se genera código para el cliente y el servidor (el implementador del objeto). El código del cliente sirve para poder realizar las llamadas a métodos remotos. Es el conocido como stub, el cual incluye un proxy (representante) del objeto remoto en el lado del cliente. El código generado para el servidor consiste en unos skeletons (esqueletos) que el desarrollador tiene que rellenar para implementar los métodos del objeto. CORBA es más que una especificación multiplataforma, también define servicios habitualmente necesarios como seguridad y transacciones. Y así este no es un sistema operativo en si, en realidad es un middleware.

POP

POP (Post Office Protocol); "Protocolo de Oficina de Correos".

Al contrario de otros protocolos creados con anterioridad como el SMTP el POP no necesita una conexión permanente a Internet, puesto que es en el momento de la conexión cuando solicita al servidor el envío de la correspondencia almacenada en el servidor para dicho usuario.

Si se está permanentemente conectado a internet pueden configurarse los programas cliente de correo de tal forma que la petición al servidor de correo se efectúe automáticamente cada cierto tiempo y de esta forma avise al usuario de que tiene correo pendiente de recibir.

La situación actual es que s
e utiliza el protocolo SMTP para el envío de correo y para la recepción de correo se utiliza el protocolo POP, pero ya en su tercera versión desde su aparición, el POP3.


Definición y significado de POP

Articulos Relacionados:

-SMTPSMTP: (Simple Mail Transfer Protocol). Protocolo Simple de Trasferencia de Correo. Protocolo que se usa para trasmitir correo electrónico entre servidores. ...

-SOHOSOHO: Acrónimo de Small Office-Home Office (Pequeña Oficina-Oficina en Casa). Ues un término que se aplica para denominar a los aparatos destinados a un uso profesiona o semiprofesional pero que,...
-MHSMHS: (Message Handling System). Sistema de Correo electrónico, que se basa en el protocolo X.400. ...

-XPLOITXPLOIT: Programa que utiliza un Bug para provocar determinados efectos, como conseguir información privada mediante un servidor de correo electrónico. ...

Número de Puerto de ProtocoloNúmero de Puerto de Protocolo Número entero pequeño usado para identificar un programa de aplicación en una computadora remota.



CODIGO:

import com.jscape.inet.pop.*;
import com.jscape.inet.mime.*;
import com.jscape.inet.email.*;
import java.util.Enumeration;
import java.io.*;

public class PopAttachmentsExample {
private static File messagesDir = new File("msg");
private static File attachmentsDir = new File("attach");
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

// get messages from Pop mailbox
public void getMessages(String hostname, String username, String password)
throws PopException, MimeException, IOException { // ensure that messages directory is valid
if(!messagesDir.exists()) {
messagesDir.mkdir();
}

// ensure that attachments directory is valid
if(!attachmentsDir.exists()) {
attachmentsDir.mkdir();
}

// connect and login
Pop pop = new Pop(hostname,username,password);
pop.connect();

System.out.println("Retrieving messsages...");
Enumeration messages = pop.getMessages();
if(!messages.hasMoreElements()) {
System.out.println("No messages found");
}

// write messages to disk
int msgnum = 0;
while(messages.hasMoreElements()) {
++msgnum;
EmailMessage msg = (EmailMessage)messages.nextElement();
File f = new File(messagesDir,"msg" + msgnum + ".txt");
FileOutputStream fout = new FileOutputStream(f);
fout.write(msg.getMessage());
fout.close();
System.out.println("Retrieved message: " + f.getAbsoluteFile());

// write attachments to disk
int attachnum = 0;
Enumeration attachments = msg.getAttachments();
while(attachments.hasMoreElements()) {
++attachnum;
Attachment attach = (Attachment)attachments.nextElement();
String attachmentFileName = attach.getFilename();
if(attachmentFileName == null) {
attachmentFileName = "attachment" + msgnum + "-" + attachnum;
}

String fileName = attach.getFilename();
if(fileName == null) {
fileName = System.currentTimeMillis() + ".txt";
}
File attFile = new File(attachmentsDir,fileName);
FileOutputStream attOut = new FileOutputStream(attFile);
try { attOut.write(attach.getFileData());
attOut.close();
System.out.println("Retrieved attachment: " + attFile.getAbsoluteFile());
}
catch(Exception e) {
throw new PopException("unable to decode file attachment");
}
}
}
pop.disconnect();
}

public static void main(String[] args) {
String hostname;
String username;
String password;

try {
System.out.print("Enter Pop3 hostname (e.g. mail.domain.com): ");
hostname = reader.readLine();
System.out.print("Enter Pop3 Username: ");
username = reader.readLine();
System.out.print("Enter Pop3 Password: ");
password = reader.readLine();
PopAttachmentsExample example = new PopAttachmentsExample();
example.getMessages(hostname,username,password);
}
catch(Exception e) {
e.printStackTrace();
}
}
}

martes, 7 de abril de 2009

Reik

Reik (Biografia)


REIK, graba sus primeros demos, imprimiéndoles el sello que los caracterizaría desde el primer momento, y que fue bien recibido por la audiencia Mexicalense. Posteriormente, en un movimiento que podríamos denominar "underground", REIK se abrió camino en diferentes ciudades de la República Mexicana, "Levemente" y “Ahora sin ti” se posicionaron rápidamente en el gusto de los jóvenes. Su sonido fresco y diferente, tuvo la fortuna de ser aceptado muy bien por el público. Fue a inicios del 2004 cuando se integra Gilberto Marín Espinoza “Bibi”, definiendo asi, el concepto de trío pop. El tema "Yo Quisiera", se colocó muy bien en la radio local y fue detonador de este proyecto.



Jesús (voz principal) nació el 9 de Julio en la ciudad de Mexicali, B.C.

Desde los seis años comenzo a cantar en coros y misas. Sus influencias musicales son muy diversas, John Mayer, Justin Timberlake, Robbie Williams, entre otros. Además, le gusta tocar el piano.

Disfruta mucho la compañia de sus amigos, lo que le permite salir a divertirse, viajar y conocer a gente.



Julio (guitarra acústica), nació el 21 de Diciembre en la ciudad de Mexicali, B.C.

Toca la guitarra desde los 12 años, teniendo como influencia musical a Further Seems Forever.

Le gusta practicar deportes como lo son el basquetboly el futbol americano. Además de que le encanta salir a divertirse, conocer gente nueva y por supuesto tocar la guitarra.

"Bibi" (guitarra eléctrica) como lo conocen todos, nació el 26 de Enero en la ciudad de Mexicali, B.C.

A los 11 años descubrió una

guitarra en el closet de su casa, y desde entonces no la ha dejado en paz. Siempre se entusiasmo con la música y la los 17 años formó una banda de garage. A los 19, su primo Micky Sandoval lo invita a formar parte de un grupo de covers antrero y desde esa invitación, no ha parado de tocar en escenarios de todo tipo.

Fue el último en formar parte de Reik, sus influencias musicales son Incubus, Radiohead, Ceratti, entre otros. Le gusta leer, meditar, enfiestarse y salir con sus amigos.


Reik (Discografia)

(Reik) Tras la firma del contrato con Sony music, a finales del mes de febrero sale a la venta su primer material discográfico, "Reik", producido por el mismo productor del grupo Abelardo Vázquez y por Kiko Cibrian. El disco contiene 11 temas inéditos y su primer corte "Yo Quisiera", se colocó inmediatamente en los primeros puestos de las radios locales y fue el detonador del grupo.
Este es uno de los discos que Reik edito a lo largo de su trayectoria. El album titulado Reik fue editado en el año 2005.





Letras de las canciones Album "Reik"♫♪♫♪



(Secuencia)Reik es un trio mexicano que desde hace muy poco comenzaron a sonar en las radios con temas como "yo quisiera" o "Noviembre sin ti", y el éxito les llego de repente, pero los muchachos están convencidos de que llegaron para quedarse, y lo que sigue es una secuencia de lo que fue.
Cargados de de baladas pop y suaves melodías, el nuevo material suena mas maduro desde las notas hasta las letras, y ellos mismos sienten ese cambio al escucharse.
11 canciones nuevas, entre ellas el primer corte "invierno". LetrasLetras de las canciones incluidas en el cd Secuencia de Reik.



Letras de las Canciones Album "Secuencia"♫♪♫♪



(Un día mas) El trío mexicano nos trae su tercer trabajo de estudio. "Un día mas" se titula la placa y supone un cambio en su estilo. Si bien el disco capta la esencia de la agrupación, mezcla nuevos sonidos y juega con las letras para entregar un nuevo producto a su público.
En "Un día mas", el trío se involucra mucho mas en la composición de las letras, 9 de las 11 canciones son de su autoría, y esta vez están acompañados por el afamado productor Gerardo “Cachorro” López junto a Coco Stambuk.
El disco se grabo en Buenos Aires, Argentina, "Inolvidable" es el primer sencillo e incluye la canción "Momentos", que sirve como tema principal de una serie de televisión con el mismo nombre que se transmitirá en México.

Letras de las canciones Album "Un dia mas"♫♪♫♪








Free Blogspot Templates by Isnaini Dot Com and Cars Picture. Powered by Blogger