lunes, 17 de julio de 2017

PROGRAMACION CLIENTE/SERVIDOR




INSTITUTO NACIONAL DE MÉXICO

INSTITUTO TECNOLÓGICO DE IGUALA

MATERIA: PROGRAMACIÓN EN AMBIENTE 

CLIENTE-SERVIDOR


ALUMNA:

GABRIELA GAONA ARTEAGA

No CONTROL: 12670034

AULA: E-3

PROFESOR: VÍCTOR MANUEL JACOBO ADAN.


INGENIERIA EN INFORMATICA

FECHA DE ENTREGA: 17 DE JULIO DEL 2017













RESUMEN DE LA CUARTA UNIDAD

COM/DCOM (Component Object Model/Distributed COM)


INTRODUCCIÓN


El Component object  Model es una arquitectura  de componentes de software que permite que las aplicaciones y sistemas  se construyen a partir  de componentes  producidos  por distintos  proveedores  de software.


Servidores COM

Los objetos “servidores” son aquellas instancias de las clases que contienen los métodos que resuelven el problema del que se ocupa el sistema.

Cliente COM

Los objetos “clientes” son aquellas instancias de las clases que contengan la interfaz del sistema con el usuario, que implementan los textos de ayuda del sistema, los cuadros de dialogo para introducir información al sistema o bien para mostrar resultados.

COM está diseñado para permitir que los clientes se comuniquen con otros objetos en forma transparente independientemente del lugar donde se están ejecutando, ya sea en el mismo proceso, la misma computadora o una computadora diferente.
COM provee acceso transparente a los servidores locales y remotos a través de objetos proxy y stub.







¿Qué es un componente COM?

·         Es un contenedor binario
·         Contiene el código de una o más clases de objetos
·         Cada clase puede tener una o más interfaces
·         COM expone o publica estas interfaces para que puedan ser usadas por otras aplicaciones.
·         Una aplicación puede usar componentes COM. independientemente del lenguaje en que fueron escritos.

DCOM

DCOM es la extensión del Component Object Model a los ambientes distribuidos, que define los mecanismos de conexión y el protocolo de red necesario para hacer llamadas a procedimientos remotos orientadas a objetos, a nivel de aplicación, que lo vuelven útil para sistemas distribuidos de todo tipo basados en componentes.

Los servidores COM/DCOM se crean como ATL Object, que producen archivos.DLL o .EXE, según el tipo de servidor que se requiera, mientras que los clientes se crean como proyectos normales de aplicaciones Windows, y que hacen referencia a las clases contenidas en la parte servidor mediante los punteros de interfaz a objetos COM/DCOM.









4.1.-CREACION DE SERVIDORES COM.

Primeramente se describe  cómo crear un servidor   COM  mediante  un editor  de texto para tener conocimiento de ello.


Los atributos se diseñaron para simplificar la tarea y la complejidad de la programación COM tradicional. El uso de atributos en las aplicaciones permite automatizar y simplificar varios procedimientos COM comunes. En este tutorial se desarrolla un servidor COM sencillo mediante un editor de texto y las herramientas de la línea de comandos.
Para utilizar atributos en las aplicaciones, debe agregar compatibilidad con atributos a las aplicaciones definiendo varias macros relacionadas (como _ATL_ATTRIBUTES) e incluyendo los archivos de encabezado relacionados.

Para crear el archivo de encabezado
  1. Abra el Bloc de notas o cualquier editor de texto.
  2. Cree un nuevo archivo llamado MyIncludes.h.
  3. Agregue el código siguiente:


  1. Guarde el archivo.
Los archivos de inclusión que empiezan por "atl" ofrecen a la aplicación compatibilidad con ATL y, con la definición de _ATL_ATTRIBUTES, también se agrega compatibilidad con la programación ATL con atributos.
Debe crear un archivo de código fuente que implemente el servidor en proceso.
Para crear el archivo de código fuente

  1. En el Bloc de notas, cree un nuevo archivo denominado MyServer.cpp.
  2. Agregue el código siguiente:



  1. Guarde el archivo.
Si utiliza el atributo module, se ahorrará el trabajo de implementar las funciones necesarias para un servidor COM en proceso. Además, no necesita escribir un archivo .idl para el archivo .def (que exporta las funciones del servidor). Esto lo hace automáticamente el atributo module.

Para generar el proyecto

  • Escriba los siguientes comandos en la línea de comandos:
Si se producen errores, compruebe si tiene Visual Studio correctamente instalado y las variables de entorno definidas.

Si el proyecto se generó correctamente, se habrá registrado el servidor en el sistema operativo.

En esta fase, el servidor COM no ofrece ninguna funcionalidad al cliente. Esto se debe a que no tiene implementado ningún objeto de servidor.

En el paso siguiente, agregará objetos de servidor a este servidor.




Para agregar objetos de servidor al servidor

  1. Abra MyServer.cpp y agregue el siguiente fragmento de código:


2.-Guarde los cambios y examine el código nuevo.

El código crea un objeto COM sencillo (CObject1) que implementa una interfaz personalizada (IObject1) con un solo método. Este método (GetANum) devuelve el valor de un miembro de datos (de tipo int).
Guarde los cambios y vuelva a generar la aplicación con los comandos del paso anterior:


Para determinar si el servidor funciona, es necesario programar una aplicación de cliente de prueba.

Para crear una aplicación de cliente de prueba
  1. Abra el Bloc de notas y cree un nuevo archivo denominado Comtest.cpp.
Comtest.cpp debe estar en la misma carpeta que MyServer.cpp.

  1. Agregue el código siguiente a Comtest.cpp:



Para que el cliente sepa lo que le ofrece el servidor, deberá importar la biblioteca de tipos del servidor mediante la palabra clave #import. Como no se especificó ningún nombre cuando se creó el servidor, el compilador generó una biblioteca de tipos con un nombre predeterminado (vc70.tlb). La siguiente línea de código (mostrada en el fragmento de código anterior) importa la biblioteca:


Cuando se importa este archivo en la aplicación de prueba, el cliente tiene acceso a la información de tipos del servidor COM. Esto permite a la aplicación de prueba hacer referencia a los tipos definidos en el servidor (como CObject1 y IObject1).

Para generar y ejecutar la aplicación de prueba
  1. Escriba lo siguiente en la línea de comandos

2.-Ejecute la aplicación escribiendo el siguiente comando:


Se verá que se imprime el valor entero.

Como crear un servidor COM mediante  asistentes.

En este tutorial, utilizará el Entorno de desarrollo integrado (IDE) de Visual Studio y los distintos asistentes para crear el mismo servidor COM ATL.

Para crear un servidor COM ATL sencillo
  1. En el menú Archivo, haga clic en Nuevo y, a continuación, haga clic en Proyecto.
Aparecerá el cuadro de diálogo Nuevo proyecto.
  1. En el panel Tipos de proyecto, haga clic en Visual C++ y, en el panel Plantillas, haga clic en el icono Proyecto ATL.
  2. En el cuadro Nombre, escriba MyServer.
  3. Haga clic en Aceptar.
Aparecerá el Asistente para proyectos ATL.
  1. Haga clic en Configuración de la aplicación.
Verá que la casilla de verificación Con atributos está seleccionada de manera predeterminada.
  1. Haga clic en Finalizar para cerrar el asistente y generar el proyecto.
El resultado es un servidor COM ATL en proceso sin objetos de servidor.
  1. En el menú Generar, haga clic en Generar solución.
Si el proyecto se generó correctamente, se habrá registrado el servidor en el sistema operativo.

El servidor COM debe implementar un objeto COM sencillo.

Para agregar un objeto de servidor
  1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto MyServer.
  2. En el menú contextual, haga clic en Agregar y, después, en Agregar clase.
Aparecerá el cuadro de diálogo Agregar clase.
  1. En el panel Plantillas, haga clic en el elemento Objeto simple ATL y después en Abrir.
Aparecerá el Asistente para objetos simples ATL.
  1. En el cuadro de texto Nombre corto, escriba Object1.
  2. Haga clic en Finalizar para aceptar los restantes valores predeterminados.
  3. En la Vista de clases, haga clic con el botón secundario del mouse (ratón) en el nodo IObject1.
  4. En el menú contextual, haga clic en Agregar y, a continuación, en Agregar propiedad.
  5. En Tipo de propiedad, escriba SHORT.
  6. En Nombre de propiedad, escriba GetANum.
  7. Haga clic en Finalizar.
  8. En el cuerpo del método get_GetANum de CObject1, reemplace el comentario por el siguiente código:




12.- En el menú Generar, haga clic en Generar solución.

Así vuelve a generar la solución. Ahora, debe crear una aplicación de cliente de prueba.

Para crear la aplicación de cliente de prueba
  1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el nodo de soluciones y seleccione Agregar y, a continuación, seleccione Nuevo proyecto.
Aparecerá el cuadro de diálogo Nuevo proyecto.
  1. En el panel Tipos de proyecto, haga clic en Visual C++ y, en el panel Plantillas, haga clic en el icono Proyecto Win32.
  2. En el cuadro de texto Nombre, escriba COMTest.
  3. Haga clic en Aceptar.
Aparecerá el Asistente para aplicaciones Win32.
  1. Haga clic en Configuración de la aplicación y seleccione Aplicación de consola.
  2. Haga clic en Finalizar para cerrar el cuadro de diálogo y generar el proyecto.
  3. En el Explorador de soluciones, haga doble clic en COMTest.cpp.
  4. Reemplace el código predeterminado por el siguiente:

9.-En el menú Generar, haga clic en Generar solución.

Para ejecutar la aplicación de prueba
  1. En la línea de comandos, cambie al directorio COMTest\Debug.
  2. Ejecute la aplicación escribiendo el siguiente comando:



4.2.-CREACION DE UN CLIENTE COM.

El cliente debe realizar las siguientes tareas:
Iniciar la librería COM
Obtener la interfaz
Manipular el objeto a través de su interfaz
Liberar las interfaces
Finalizar la librería COM
Para iniciar la librería COM hay que llamar al método del API COM CoInitialize:

            hr = CoInitialize(NULL);
            if ( SUCCEEDED(hr) )
            {
                        ...
            }

El método CoInitialize inicializa la librería en el thread de ejecución desde el que se invoque. Es necesario llamar a CoInitialize desde cada thread de la aplicación que quiera acceder a objetos COM.

OBTENER LA INTERFAZ
Para obtener la interfaz inicial llamamos al método CoCreateInstance, este creará una nueva instancia de un objeto COM y nos devolverá un puntero a su interfaz.
            IUnknown *pIUnknown = NULL;
            hr = CoCreateInstance(CLSID_UserInfo, NULL,
                                   CLSCTX_INPROC_SERVER, IID_IUnknown,
                                   (LPVOID *)&pIUnknown);
            if (SUCCEEDED(hr))
            {....}

A través del puntero a IUnknow obtener el puntero a la interfaz IUserInfo
                        hr = pIUnknown->QueryInterface(IID-IUserInfo,
                                   (LPVOID *)&pIUserInfo);
                                   if (SUCCEEDED(hr))
                                               {\\manipulación del objeto}

LIBERAR LAS INTERFACES
Para liberar las interfaces hay que llamar al método Release, si el objeto COM no tiene más interfaces referenciadas se borrara automáticamente:

            pIUserInfo->Release ();
            pIUnknown->Release ();

FINALIZAR LAS LIBRERIAS

La librería COM se finaliza a través del método CoUninitialize, una vez llamado a este método no se podrá seguir llamando a funciones de la librería COM ni manipulando objetos COM.







4.3.-AUTOMATIZACIÓN.



Basado en la Biblioteca de plantillas estándar (STL), ATL amplía el entorno de desarrollo de Visual Studio con asistentes utilizados para la automatización objeto COM. ATL facilita la programación de objetos COM para la invocación guion de páginas Active Server (ASP). ATL se puede utilizar para crear una variedad de objetos, incluyendo cuadros de diálogo y los controles de Internet Explorer. ATL soporta características de COM clave, como los controles ActiveX, interfaces duales y puntos de conexión.


La Automatización (antes denominada Automatización OLE) permite a las aplicaciones utilizar objetos implementados en otras aplicaciones o exponer objetos de forma que puedan utilizarlos otras aplicaciones.

Un servidor de automatización es una aplicación (un tipo de servidor COM) que expone su funcionalidad a otras aplicaciones mediante interfaces COM, denominadas clientes de automatización. Esto permite automatizar determinadas funciones en los clientes de automatización mediante el acceso directo a objetos y el uso de los servicios que estos objetos proporcionan.

Los servidores y los clientes de automatización utilizan interfaces COM que se derivan siempre de IDispatch y que toman y devuelven un conjunto de tipos de datos específicos denominados tipos de automatización. Puede automatizar cualquier objeto que expone una interfaz de automatización que proporciona métodos y propiedades a las que se puede tener acceso desde otras aplicaciones. La Automatización está disponible tanto para objetos OLE como para objetos COM.

El objeto automatizado puede ser local o remoto (puede estar en otro equipo accesible a través de la red); por lo tanto, hay dos categorías de automatización:

  • Automatización (local).
  • Automatización remota (a través de una red, mediante COM distribuido o DCOM).
La exposición de objetos es beneficiosa si las aplicaciones proporcionan funcionalidad útil para otras aplicaciones. Por ejemplo, un control ActiveX es un tipo de servidor de automatización; la aplicación que aloja el control ActiveX es el cliente de automatización del control.
Análogamente, un procesador de textos podría exponer su funcionalidad de corrección ortográfica a otros programas. La exposición de objetos permite a los proveedores mejorar sus aplicaciones por medio de funcionalidad ya programada de otras aplicaciones. De esta manera, la Automatización aplica a las aplicaciones algunos principios de la programación orientada a objetos, como la reutilización y la encapsulación.

Otro factor aún más importante es la compatibilidad que la Automatización proporciona a los proveedores de soluciones y usuarios. La Automatización, como expone la funcionalidad de una aplicación mediante una interfaz común y bien definida, permite generar soluciones completas con un único lenguaje de programación general, como Microsoft Visual Basic, y evita así la necesidad de utilizar varios lenguajes de macros específicos de la aplicación.

Muchas aplicaciones comerciales, como Microsoft Excel y Microsoft Visual C++, permiten automatizar gran parte de su funcionalidad. Por ejemplo, en Visual C++ puede escribir macros de VBScript para automatizar el proceso de generación, algunos aspectos de la edición de código o las tareas de depuración.

Transferir parámetros en la Automatización.


Una de las dificultades de crear métodos de automatización es la necesidad de proporcionar un mecanismo "seguro" y uniforme para transferir datos entre los servidores de automatización y los clientes de automatización. La Automatización utiliza el tipo VARIANT para transferir datos.

El tipo VARIANT es una unión con etiquetas. Tiene un miembro de datos para el valor (una unión anónima de C++) y un miembro de datos que indica el tipo de información almacenada en la unión. El tipo VARIANT es compatible con varios tipos de datos estándar: enteros de 2 y 4 bytes, números de punto flotante de 4 y 8 bytes, cadenas y valores Boolean. Además, es compatible con los tipos HRESULT (códigos de error OLE), CURRENCY (un tipo numérico de punto fijo) y DATE (fecha y hora absolutas), así como con punteros a interfaces IUnknown e IDispatch.

El tipo VARIANT está encapsulado en la clase COleVariant. Las clases CURRENCY y DATE compatibles están encapsuladas en las clases COleCurrency y COleDateTime.





4.4.-ATL (ACTIVE TEMPLATE LIBRARY).

Active (ATL) Template Library es un conjunto de clases de C++ basadas en plantillas que permiten crear objetos pequeños, rápidos (COM) del modelo de objetos componentes. Tiene compatibilidad especial para características COM clave, incluidas las implementaciones comunes, interfaces duales, interfaces COM estándar de enumeradores, puntos de conexión, rasga interfaces, y controles ActiveX.

Si tiene muchos programación ATL, deseará obtener más información sobre atributos, una característica nueva de Visual C++ .NET que está diseñado para simplificar la programación COM. Para obtener más información, vea Programación con atributos.





4.5.-DCOM (DISTRIBUTED COM).


Distributed Component Object Model (DCOM), en español Modelo de Objetos de Componentes Distribuidos, es una tecnología propietaria de Microsoft para desarrollar componentes software distribuidos sobre varios ordenadores y que se comunican entre sí. Extiende el modelo COM de Microsoft y proporciona el sustrato de comunicación entre la infraestructura del servidor de aplicaciones COM+ de Microsoft. Ha sido abandonada en favor del framework .NET.1 2


La adición de la "D" a COM fue debido al uso extensivo de DCE/RPC, o más específicamente la versión mejorada de Microsoft, conocida como MSRPC.
En términos de las extensiones que añade a COM, DCOM tenía que resolver los problemas de
    Aplanamiento - Serializar y de serializar los argumentos y valores de retorno de las llamadas a los métodos "sobre el cable".
    Recolección de basura distribuida, asegurándose que las referencias mantenidas por clientes de las interfaces sean liberadas cuando, por ejemplo, el proceso cliente ha caído o la conexión de red se pierde.
Uno de los factores clave para resolver estos problemas es el uso de DCE/RPC como el mecanismo RPC subyacente bajo DCOM. DCE/RPC define reglas estrictas en cuanto al aplanamiento y a quién es responsable de liberar la memoria.
DCOM fue uno de los mayores competidores de CORBA. Los defensores de ambas tecnologías sostenían que algún día serían el modelo de código y servicios sobre Internet.
Sin embargo, las dificultades que suponía conseguir que estas tecnologías funcionasen a través de cortafuegos y sobre máquinas inseguras o desconocidas, significó que las peticiones HTTP normales, combinadas con los navegadores web les ganasen la partida. Microsoft, en su momento intentó y fracasó anticiparse a esto añadiendo un transporte extra HTTP a DCE/RPC denominado "ncacn_http" (Connection-based, over HTTP).





CONCLUSIONES


Estas tecnologías tienen como base la arquitectura cliente-servidor, utilizan un protocolo de transporte para enviar mensajes a través de las computadoras en una red y además usan un tipo de invocación de método remoto.

Por su parte las tecnologías COM/DCOM y ActiveX también permiten el desarrollo de aplicaciones distribuidas, sin embargo al principio fueron duramente criticadas por ser un estándar para servir únicamente al sistema operativo de Microsoft.

Al presentar problemas de seguridad con el uso de los Controles ActiveX en Internet, Microsoft trató de resolverlos con el desarrollo del framework Net.

Gracias a su arquitectura Net ha permitido que los programadores experimentados en lenguajes como el Visual BASIC puedan desarrollar aplicaciones distribuidas incluso para dispositivos PDA colocándose en el mercado actual como una tecnología de vanguardia para este tipo de desarrollos.




REFERENCIAS


1.-(http://www.utm.mx/temas/temas-docs/nota5t30.pdf)
2.- (https://technet.microsoft.com/en-us/library/cc958799.aspx)
3.- (https://msdn.microsoft.com/es-es/library/cc451476(v=vs.71).aspx)
4.- (https://msdn.microsoft.com/es-es/library/ms733133(v=vs.100).aspx)
5.- (http://programacionambienteclienteservidor.blogspot.mx/2014/11/comdcom-component-       object-model.html)
6.- (https://msdn.microsoft.com/es-es/library/hk7y1596(v=vs.100).aspx?cs-save-lang=1&cs-       lang=csharp#code-snippet-9)
7.- (https://msdn.microsoft.com/es-es/library/cc451349(v=vs.71).aspx)
8.- (https://msdn.microsoft.com/es-es/library/cc451350(v=vs.71).aspx)