29 febrero 2008

Creando aplicaciones multicapa (V)

En esta ocasión vamos a crear un servidor de aplicaciones utilizando sockets en lugar de utilizar DCOM. Aunque los pasos son prácticamente los mismos, hay una pequeña diferencia: hay que utilizar un programa de Borland que hace de puente entre nuestro servidor de aplicaciones y las aplicaciones cliente.

Veamos un ejemplo paso a paso. Antes de empezar creamos una carpeta donde alojar el proyecto del servidor de aplicaciones. Por ejemplo:

D:\Desarrollo\DelphiAlLimite\Multicapa\ServidorSockets\

CREANDO EL SERVIDOR DE APLICACIONES

1. Creamos un nuevo proyecto (File -> New -> Application).

2. La ventana principal de la aplicación la llamamos FPrincipal, guardando su unidad con el nombre UPrincipal. Como título de esta ventana podemos poner: Servidor de Sockets.

3. Añadimos al proyecto un módulo de datos remoto: File -> New -> Other. Pulsamos sobre la pestaña Multitier, seleccionamos Remote Data Module y pulsamos Ok. Aparecerá la siguiente ventana:


3. En el campo CoClass Name escribimos Servidor y pulsamos Ok.

4. Guardamos la unidad del módulo de datos remoto creado con el nombre UServidor.

5. Al igual que hicimos en el servidor DCOM vamos a crear los siguientes componentes para acceder a la base de datos Firebird:


Se compone de:

- Un componente IBDatabase llamado BaseDatos (pestaña Interbase).

- Un componente IBTransaction llamado Transaccion (pestaña Interbase).

- Un componente IBQuery llamado TClientes (pestaña Interbase).

- Un componente DataSetProvider llamado DSPClientes (pestaña Data Access).

6. Para el componente IBDatabase modificamos las siguientes propiedades:

DatabaseName: 127.0.0.1:D:\Desarrollo\DelphiAlLimite\Multicapa\ServidorSockets\BASEDATOS.FDB
DefaultTransaction: Transaccion.
LoginPrompt: False
SQLDialect: 3

7. Para el componente IBTransaction ponemos en su propiedad DefaultDataBase: BaseDatos.

8. Para el componente IBQuery llamado TClientes cambiamos las propiedades:

Database: BaseDatos
Transaction: Transaccion
SQL: SELECT * FROM CLIENTES

9. Y en el componente DataSetProvider seleccionamos TClientes en su propiedad DataSet.

Con esto ya tenemos un servidor básico de aplicaciones utilizando Sockets. Como se puede apreciar no hay mucha diferencia respecto al servidor DCOM que creamos con anterioridad. Ahora vamos a ver como crear la aplicación cliente.

CREANDO LA APLICACION CLIENTE

En esta ocasión vamos a crear la aplicación cliente utilizando un módulo de datos remoto normal (no transaccional). Este módulo de datos no tiene la misma seguridad avanzada que un módulo de datos transaccional pero la comunicación es muy rápida, gastando muy poco ancho de banda.

Cuando establecemos una conexión con el servidor de aplicaciones usando sockets la comunicación se realiza a través del protocolo normal TCP/IP, gozando de la ventaja de poder traspasar cualquier red.

Aquí podemos encontrar una diferencia respecto a un cliente DCOM. Cuando conectamos con el servidor debemos tener arrancado un programa llamado Borland Socket Server que es el intermediario entre nuestro servidor y el cliente. Este programa esta en el directorio bin de la carpeta donde esté instalado Delphi. Lo recomendable sería copiar este programa (scktsrvr.exe) al directorio donde tengamos nuestro servidor de aplicaciones.

Para crear la aplicación cliente vamos a seguir los siguientes pasos:

1. Creamos una carpeta para alojar la aplicación cliente. Por ejemplo:

D:\Desarrollo\DelphiAlLimite\Multicapa\ClienteSockets\

2. Creamos un nuevo proyecto (File -> New -> Application) y le damos a la ventana principal el nombre FCliente. La guardamos con el nombre UCliente.pas.

3. En esta ventana vamos a añadir los siguientes componentes:


- Un componente ClientDataSet llamado TClientes (pestaña Data Access).

- Un componente DataSource llamado DSClientes (pestaña Data Access).

- Un componente SocketConnection que vamos a llamar ClienteSocket (pestaña DataSnap).

- Un componente DBGrid llamado ListadoClientes (pestaña Data Controls).

4. Antes de intentar conectar el cliente debemos arrancar el programa de Borland scktsrvr.exe. Al ejecutar este programa se quedará residente en la bandeja del sistema (el icono azul con el rayo amarillo):


Si pulsamos el botón derecho del ratón sobre el icono y seleccionamos Properties podemos ver la su configuración y puertos por defecto (por si nos interesa cambiarlos).

5. Para el componente SockectConnection modificamos sus propiedades:

Address: 127.0.0.1
ServerName: ServidorSockets.Servidor
Connected: True

Al seleccionar ServidorSockets.Servidor rellenará automáticamente el campo ServerGUID. Al activar la propiedad Connected arrancará automáticamente nuestro programa que hace de servidor, al igual que ocurría con nuestro servidor DCOM. Pero recordad que esto no funciona si no esta en ejecución el programa Borland Socket Server (scktsrvr.exe).

6. Para el componente ClientDataSet fijamos las siguientes propiedades:

ProviderName: DSPClientes
RemoteServer: ClienteSocket

7. Seleccionamos TClientes en la propiedad DataSet del componente DSClientes.

8. Y por último vinculamos el componente DBGrid al componente DSClientes a través de su propiedad DataSource.

9. Si ponemos a True la propiedad Active del componente ClientDataSet aparecerán los datos en pantalla en tiempo de diseño:


Si abrimos una ventana de comandos (MS-DOS) y ejecutamos:

netstat -bn (para Windows XP con SP2)

podemos ver las conexiones abiertas tanto en Delphi como en el servidor de aplicaciones:


Como puede apreciarse la comunicación se ha realizado a través del puerto 211, lo que significa que habrá que abrir dicho puerto tanto en nuestros routers como en los cortafuegos si queremos establecer la comunicación correctamente.

En la siguiente parte de este artículo veremos como crear un servidor de aplicaciones y un cliente a través del protocolo HTTP (puerto 80).

Pruebas realizadas con Dephi 7.0 y Firebird 2.0.

13 comentarios:

Anónimo dijo...

buenas, estoy creando una aplicacion cliente servidor en delphi 7 con interbase haciendo uso de sockets, he seguido los pasos del articulo pero tengo un problema cuando intento acceder al ibquery para ingresar a los datos de una tabla, me es imposible llevar a cabo esta accion si en las propiedades del ibdatabase tengo el login prompt desactivado (false), si lo activo con lo cual si me deja acceder a los datos e intento realizar la aplicacion cliente en la cual todo trabaja bien hasta el momento ke voy a poner la propiedad active del clientdataset a true ya que me aparece el error "user name or password not defined", agradeceria cualkier colaboracion o ayuda ke me puedan brindar, de antemano muchas gracias

Administrador dijo...

Es normal que si intentas acceder a las propiedades del objeto IBQuery se intente activar automáticamente la conexión con la base de datos.

Por ello es importante meter en el objeto IBDatabase todos los parámetros de la conexión: IP, gdb, SYSDBA, masterkey, etc.

Cuando el ClientDataSet intenta conectarse, entonces se crea una instancia del módulo de datos remoto en el servidor y abre automáticamente el objeto IBQuery.

El objeto IBQuery a su vez intenta abrir la base de datos (IBDatabase), por ello es importante dejar todos esos parámetros introducidos (o bien en el editor de Delphi o en tiempo real en el evento OnCreate del módulo de datos remoto del servidor).

Espero haberte sido de ayuda. Y no te rindas, para averiguar yo esto me tuve que romper la cabeza haciendo pruebas, ya que no hay documentación sobre esto en ningún sitio (y la que hay apesta).

Si sigues con problemas me lo dices y pensamos otra cosa. Incluso puedes mandarme el proyecto por correo y te digo si chuta o no.

Saludos.

Anónimo dijo...

Oye segui tus indicaciones y relacione los parametros que me indicaste en el componente ibdatabase pero ahora al tratar de poner en true la propiedad active del clientdataset se genera el siguiente error "Operation cancelled at user's request", y eso que simplemente estoy tratando de hacer que me funcione un ejemplo de un tutorial para asi pasar a implementarlo en la aplicacion que lo necesito, oye te agradezco infinitamente tu colaboracion.

Administrador dijo...

La verdad es que un error así de raro no me ha dado a mi nunca. Podría ser a lo mejor por que hay que abrir el puerto de sockets en el cortafuegos.

Por si acaso vamos a hacer una cosa. Te he subido a RapidShare los dos proyectos (servidor y cliente):

http://rapidshare.com/files/123754879/ServidorSocket.zip.html

http://rapidshare.com/files/123755059/ClienteSocket.zip.html

Compara el código fuente de mis proyectos con el tuyo a ver si hay alguna diferencia.

Y a las malas, si no logras solucionar el problema me mandas tu proyecto (con las bases de datos) y trato de averiguar que pasa.

Suerte.

Anónimo dijo...

Hola, oye ke pena molestarte tanto, pero estuve tratando de descargar los archivos ke pusiste en rapidshare con los link's ke pusiste ak pero me fue imposible, me dice ke el archivo no existe, ninguno de los dos, te agradeceria si me los vuelves a subir o me los envias al correo marlinaca@hotmail.com, te estoy muy agradecida y de nuevo muchas gracias por tu colaboracion

Anónimo dijo...

Hola yo por aca molestando otra ves, mira que ya pude solucionar varios de los problemas que tenia pero otros persisten y te queria pedir que por favor me enviaras tu correo o que me agregaras al msn mi correo es marlinaca@hotmail.com para hacerte llegar el proyecto ya que con los archivos que me enviaste solucione algunos problemas pero aun otros siguen y la verdad no se como solucionarlos y quisiera tu colaboracion, de verdad ke te estoy muy agradecida, muchisimas gracias, chao y de nuevo muchas gracias

Administrador dijo...

Mi correo es:

taxylon@gmail.com

No dudes en escribirme para cualquier duda o para mandarme tu proyecto.

Haré lo que pueda.
Saludos.

nelson mateo de la cruz dijo...

hola soy nelson mateo ne interesa aprender a programar aplicaciones cliente servidor pero no se manejar intebase y me gustaria aprender
si algundia te animaras a escribir un manaul eficiente y claro como aclaras este tema de la aplicaciones cliente servidor te lo agradeseria

nelson mateo de la cruz dijo...

hola mi nombre es nelson
por lo general estoy greando aplicaciones o punto de venta pero con acceso red local y me intesa crea aplicaciones cliente servidor.
otra cosa es que no se manejar interbase sino sql-server y me gustaria si no te es molestia que publicaras un manual claro y explicito de interbase manejo y configuracion y creacion de base de datos y por favor podrias subir los link's
att nelson mateo

Administrador dijo...

Puede que algún día escriba como crear un programa de bases de datos cliente/servidor con Interbase/Firebird desde el principio.

Me lo pensaré.

Unknown dijo...

buenas me parece un buen tutorial, pero tengo algunas dudas hice todo tal cual esta en mi PC1 esta corriendo el server, y en mi PC 2 esta corriendo el cliente, las visualizaciones son buenas.
Lo que pasa es q cuando quiero ingresar un nuevo dato en la aplicacion cliente no envia los datos al servidor.
Reitero que estan en maquinas separadas la app cliente y app servidor.
´Como se haria para que envie y grabe

Unknown dijo...

Hola,

recientemente descubrí este blog de delphi. Se me hace demasiado bueno e interesante. De antemano mis mas sinceras felicitaciones. Me ha sido de mucha ayuda en algunas cosas que he estado haciendo. De hecho ya lo revisé todo. Solo que me intriga el hecho de que todo termina con articulos de fechas del 2010.
¿Debo entender que ya se acabó este blog? ya no habrá mas articulos sobre Delphi 7 y quizá de delphi 2010 o mas reciente?

Juan Angel Alvarez Vázquez

Administrador dijo...

Por falta de tiempo no he podido seguir con el blog como a mi me gustaría.

Si las cosas cambian en un futuro quizá actualice los artículos y meta algunos nuevos. Pero ahora es imposible.

Gracias y saludos.

Publicidad