23 noviembre 2007

Creando aplicaciones multicapa (IV)

Una vez que hemos creado nuestro servidor DCOM vamos a implementar nuestra aplicación cliente que se va a encargar de llamarlo.

CREANDO LA APLICACION CLIENTE

Para conectar un cliente multicapa al servidor DCOM vamos a utilizar un componente de la clase TDOMConnection que buscará en tiempo de diseño el servidor.

Como se verá a continuación no es necesario añadir un componente de la clase TDataSetProvider ni ningún otro relacionado con motores de bases de datos específicos. Eso ya se lo hemos dejado al servidor de aplicaciones. Tampoco es necesario que el servidor de aplicaciones que creamos en el artículo anterior se esté ejecutando mientras diseñamos el cliente.

Para realizar las pruebas vamos a crear un nuevo proyecto que contenga un sólo formulario y los siguientes componentes:


- Un componente TDBGrid llamado ListadoClientes destinado a listar todos los campos de la tabla CLIENTES.

- Un componente TClientDataSet llamado TClientes.

- Un componente TDataSource que lo vamos a llamar DSClientes.

- Un componente TDCOMConnection que lo llamaremos Conexion.

Ahora vamos a vincular unos componentes a otros:

- Vinculamos el componente TDataSource llamado DSClientes con la rejilla ListadoClientes a través de su propiedad DataSource.

- Vinculamos el componente TClientDataSet llamado TClientes al componente TDataSource llamado DSCliente en su propiedad DataSet.

- Asociamos el componente TDOMConnection llamado Conexion al componente TClientDataSet llamado TClientes utilizando su propiedad RemoteServer.

Aquí nos detenemos para analizar un problema. El componente TClientDataSet no mostrará nada que no venga de un componente TDataSetProvider. Como dicho componente se encuentra en el servidor de aplicaciones, lo primero que hay que hacer es conectar con el servidor de aplicaciones para poder vincular su DataSetProvider:

- Seleccionamos el componente TDOMConnection y en su propiedad ServerName elegimos ServidorDatos.ServidorDCOM. Al hacer esto debe rellenarnos automáticamente el campo ServerGUID, el cual es un identificador de la interfaz del módulo de datos remoto que creamos en el servidor de aplicaciones.

- Activamos la propiedad Connected en el componente TDOMConnection y veremos que se ejecuta automáticamente el servidor de aplicaciones mostrándonos su formulario principal.

- Dejando el servidor de aplicaciones en ejecución seleccionamos el componente TClientDataSet y en su propiedad ProviderName seleccionamos DSPClientes.

Con sólo realizar estos pasos, si activamos la propiedad Active del componente TClientDataSet nos mostrará en tiempo de diseño los datos de la tabla clientes:


Al compilar y ejecutar nuestro programa cliente ya tenemos un programa que maneja los datos del servidor sin preocuparse del motor de bases de datos o de otros usuarios conectados.

El componente TDOMConnection tiene la propiedad llamada ComputerName la cual contiene el nombre del equipo donde se va a alojar el servidor de aplicaciones. Si no seleccionamos ninguno se asume que el servidor de aplicaciones y la aplicación cliente residen en la misma máquina.

Si intentamos cerrar el servidor de aplicaciones mientras está conectado el cliente saldrá este mensaje:

There are still active COM objects in this application. One o more clients may have references to these objects, so manually closing this application may cause those client application(s) to fail.

Are you sure want to close this application?

Lo que traducido al castellano sería:

Todavía hay objetos COM activos en esta aplicación. Uno o más clientes podrían estar utilizando estos objetos, así que si cierra esta aplicación podría causar un error de conexión en los clientes.

¿Esta seguro de cerrar esta aplicación?

Esto significa que nunca debemos cerrar el servidor mientras quede algun cliente conectado a nosotros. Además, si el último cliente que estaba conectado al servidor de aplicaciones desconecta entonces el servidor de aplicaciones se cerrará automáticamente al ver que no hay ninguna conexión abierta.

En la siguiente parte de este artículo veremos como crear un servidor de aplicaciones y una aplicación cliente utilizando otros protocolos distintos a DCOM.

Pruebas realizadas en Delphi 7.

12 comentarios:

Anónimo dijo...

Hola.

Felicidades por el blog. Me parecen muy interesantes los artículos.

Saludos.

Al González.

CresceNet dijo...

Gostei muito desse post e seu blog é muito interessante, vou passar por aqui sempre =) Depois dá uma passada lá no meu site, que é sobre o CresceNet, espero que goste. O endereço dele é http://www.provedorcrescenet.com . Um abraço.

DocJones dijo...

yo tambien te felicito , los articulos son interensantisimos , por favor sigue asi , yo estoy aprendiendo mucho sobre cosas que no sabia y eso que llevo años programando con delphi profesionalmente. espero ansiosamente el siguiente articulo de 3 capas . saludos y gracias.
d.cano.

DocJones dijo...

una pregunta respecto a las 3 capas , si queremos crear aplicaciones 3 capas a traves de dcom y que el cliente se conecte al servidor por internet , ¿ que puertos habria que abrir ?. o para esto es mejor conectar a traves de sockets ?. merece la pena montar un servidor web y hacerlo todo a través de http ?.

saludos y gracias.
d.cano.

Delphi al Límite dijo...

Muchas gracias DOCJONES por tu apoyo.

Según tengo leido, si las comunicaciones DCOM están sobre el protocolo TCP/IP entonces utilizan el puerto 135 (RPC).

En el 2003 se detectó un error de seguridad en este puerto que luego solucionó Microsoft, por lo que recomiendo utilizar otros protocolos a través de Internet, como veremos más adelante (Socket o HTTP).

Cuando me quite todo el trabajo que tengo pendiente (que no es poco) tengo pensado terminar esta seríe de artículos relacionada con las aplicaciones multicapa y empezar nuevos temas que tengo en mente.

Pero el tiempo es mi enemigo...

yo dijo...

Hola que tal, el blog esta genial, en internet hay pocos como este, yo soy estudiante del 8 semestre de sistemas computacionales administrativos y tus articulos me ayudan para desarrollar una aplicacion, solo que tengo una duda,yo utilizo delphi 6 y mysql, en la máquina donde desarrollé tanto el cliente como el servidor funcionan perfecto, pero cuando pase el cliente a otra máquina (de la red local de esta oficina), no pudo correr, me marco error, ¿qué puede ser? saludos.

Delphi al Límite dijo...

Asegúrate de que tanto en la máquina cliente como en el servidor no esté el cortafuegos cerrando el puerto del motor de bases de datos MySQL.

Eso si estas haciendo una aplicación normal cliente/servidor. Si estas utilizando DCOM mediante capas tendrás que registrar el servidor remoto en la máquina cliente dándole el nombre de la máquina que hace de servidor en red.

Saludos.

Anónimo dijo...

Hola delphi al limite eres lo maximo pero que a pasado veo que no has sacado mas articulos, me gustaria leer algo para prinsipiantes que no lo son tanto, una explicacion de donde vienen ciertas cosas como las clases y los objetos: segun he leido una clase es un registro cullos campos son o pueden ser tanto variables como procedimientos y un objeto es una variable cullo tipo es una clase, pero me gustaria algo un poquito mas detallado. muchas gracias
atte:
mikrosurfer@hotmail.com

Delphi al Límite dijo...

El motivo de no poder sacar más artículos es porque tengo mucho trabajo pendiente o no doy a basto. En cuanto termine lo que tengo pendiente (ya falta poco) seguiré escribiendo artículos en este blog.

Respecto a lo de escribir artículos para principiantes, quizá lo haga cuando termine con Delphi 7 y comience con Delphi 2007 para Win32.

Recibe un cordial saludo.

Anónimo dijo...

buenas, esta muy interesante este articulo, pero tengo una duda, he seguido todos los pasos paso a paso valga la redundancia pero cuando voy a elegir el server name del componente TDCOMconexion no se me despliega ningun server name, agradeceria me pudiera colaborar ya que es muy importante para mi, muchas gracias

Administrador dijo...

Cuando no encuentra el nombre del servidor puede ser por dos cosas:

- Que no hayas puesto la IP correcta donde está ejecutándose el servidor de aplicaciones (cosa poco probable, supongo que lo habrás comprobado 80 veces).

- Que no encuentre por la red el servidor COM en otro puesto. Eso es lo que me ha ocurrido a mi muchas veces. Unas veces era porque el cortafuegos del equipo que hace de servidor estaba capando el puerto DCOM y en otras ocasiones porque no estaba activado el servicio DCOM.

Al final me harté y ahora sólo utilizo DCOM para comunicar programas dentro de la misma máquina y SOAP o TCP para hacerlo entre máquinas de la red e Internet.

Saludos.

Oscar Benitez dijo...

Un excelente blog, lástima que se haya abandonado, ¿alguien sabe si el administrador se cambió a otra plataforma?
Saludos
Oscar Benitez

Publicidad