antología.. progra cuarto

Upload: torito28

Post on 11-Jul-2015

169 views

Category:

Documents


0 download

TRANSCRIPT

Universidad Tecnolgica de PueblaCarrera:

Ingeniera de Tecnologas de la Informacin y Comunicacin

ANTOLOGA Desarrollo de aplicaciones II

Cuatrimestre: Septiembre Diciembre 2011

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Objetivo de la asignatura:

El alumno desarrollar aplicaciones distribuidas utilizando patrones de diseo y arquitectura multicapa para mejorar su rendimiento, desempeo y seguridad.

I Patrones de DiseoAlgunas definiciones de patrones de diseo son las siguientes: Los patrones de diseo son descripciones de clases y objetos relacionados que estn particularizados para resolver un problema de diseo general en un determinado contexto. Cada patrn describe un problema que ocurre una y otra vez en nuestro entorno, as como la solucin a ese problema, de tal modo que se pueda aplicar esta solucin un milln de veces, sin hacer lo mismo dos veces. Un patrn de diseo es una solucin a un problema de diseo. Para que una solucin sea considerada un patrn debe poseer ciertas caractersticas. Una de ellas es que debe haber comprobado su efectividad resolviendo problemas similares en ocasiones anteriores. Otra es que debe ser reusable, lo que significa que es aplicable a diferentes problemas de diseo en distintas circunstancias Los patrones de diseo son un conjunto de prcticas de ptimo diseo que se utilizan para abordar problemas recurrentes en la programacin orientada a objetos. Un patrn de diseo nomina, abstrae e identifica los aspectos clave de una estructura de diseo comn, lo que los hace tiles para crear un diseo orientado a objetos reutilizable. El patrn de diseo identifica las clases e instancias participantes, sus roles y colaboraciones, y la distribucin de responsabilidades. Cada patrn de diseo se centra en un problema concreto, describiendo cundo aplicarlo y si tiene sentido hacerlo teniendo en cuenta otras restricciones de diseo, as como las consecuencias y las ventajas e inconvenientes de su uso. Por otro lado, como normalmente tendremos que implementar nuestros diseos, un patrn tambin proporciona cdigo en algn lenguaje de programacin orientado a objetos. En general, un patrn tiene cuatro elementos esenciales: 1. El nombre del patrn permite describir, en una o dos palabras, un problema de diseo junto con sus soluciones y consecuencias. Al dar nombre a un patrn incrementamos nuestro vocabulario de diseo, lo que nos permite disear con mayor abstraccin. 2. El problema describe cundo aplicar el patrn. Explica el problema y su contexto. Puede describir problemas concretos de diseo (por ejemplo, cmo representar algoritmos como objetos), as como las estructuras de clases u objetos que son sintomticas de un diseo inflexible. A veces el problema incluye una serie de condiciones que deben darse para que tenga sentido aplicar el patrn. 3. La solucin describe los elementos que constituyen el diseo, sus relaciones, responsabilidades y colaboraciones. La solucin no describe un diseo o una implementacin en concreto, sino que unElaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

patrn es ms bien como una plantilla que puede aplicarse en muchas situaciones diferentes. El patrn proporciona una descripcin abstracta de un problema de diseo y como lo resuelve una disposicin general de clases y objetos. 4. Las consecuencias son los resultados as como las ventajas e inconvenientes de aplicar el patrn. Aunque cuando se describen decisiones de diseo muchas veces no se reflejan sus consecuencias, stas son fundamentales para evaluar las alternativas de diseo y comprender los costes y beneficios de aplicar el patrn. Las consecuencias en el software suelen referirse al equilibrio entre espacio y tiempo. Tambin pueden tratar cuestiones de lenguaje e implementacin. Por otro lado, puesto que la reutilizacin suele ser uno de los factores de los diseos orientados a objetos, las consecuencias de un patrn incluyen su impacto sobre la flexibilidad, extensibilidad y portabilidad de un sistema. Incluir estas consecuencias de un modo explcito nos ayudar a comprenderlas y evaluarlas.

Importancia de los patrones de diseo Para disear software orientado a objetos reutilizable hay que encontrar los objetos pertinentes, factorizarlos en clases con la granularidad adecuada, definir interfaces de clases y jerarquas de herencia y establecer las principales relaciones entre esas clases y objetos. El diseo debe ser especfico del problema que estamos manejando, pero tambin lo suficientemente general para adecuarse a futuros requisitos y problemas. Tambin queremos evitar el rediseo, o al menos minimizarlo. Lo que no hay que hacer es resolver cada problema partiendo desde cero. Por el contrario, se deben reutilizar soluciones que ya han sido tiles en el pasado. Cuando se encuentra una solucin buena, debe usarse una y otra vez. Por tanto, nos encontramos con patrones recurrentes de clases y comunicaciones entre objetos en muchos sistemas orientados a objetos. Estos patrones resuelven problemas concretos de diseo y hacen que los diseos orientados a objetos sean ms flexibles, elegantes y reutilizables. Los patrones ayudan a los diseadores a reutilizar buenos diseos al basar los nuevos diseos en la experiencia previa. Un diseador familiarizado con dichos patrones puede aplicarlos inmediatamente en los problemas de diseo sin tener que redescubrirlos. Los patrones de diseo hacen que sea ms fcil reutilizar buenos diseos y arquitecturas. Al expresar como patrones de diseo tcnicas que ya han sido probadas, las estamos haciendo ms accesibles para los desarrolladores de nuevos sistemas. Clasificacin de los patrones de diseo Los patrones de diseo se dividen en tres grupos principales:

Patrones de creacin: Patrn de Fbrica Abstracta, Patrn Constructor, Patrn del Mtodo de Fabricacin, Patrn Prototipo, Patrn de Instancia nica (Singleton). Patrones estructurales: Patrn Adaptador, Patrn Puente, Patrn Compuesto, Patrn Decorador, Patrn de Fachada, Patrn de Peso Mosca, Patrn Apoderado.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Patrones funcionales: Patrn de Cadena de Responsabilidad, Patrn de Comando, Patrn Intrprete, Patrn Iterador, Patrn Mediador, Patrn Memento, Patrn Observador, Patrn de Estado, Patrn de Estrategia, Patrn del Mtodo Plantilla, Patrn Visitante.

Descripciones de algunos patrones de diseo: Strategy Pattern.- El patrn de estrategia es un patrn de diseo de comportamiento que nos permite decidir qu curso de accin debera tener un programa, basado en un contexto especfico en tiempo de ejecucin. El programa encapsula dos algoritmos diferentes dentro de dos clases y decide, en tiempo de ejecucin, que estrategia debe seguir.

Adapter Pattern, El patrn adaptador es un patrn de diseo estructural que nos permite reutilizar una clase con una interfaz diferente, lo que permite ser utilizada por un sistema que utiliza diferentes mtodos de llamada. Esto tambin nos permite cambiar algunos campos que estn siendo recibidos de la clase cliente, convirtindolos en algo compatible con las funciones adaptadas. Otro trmino para hacer referencia a una clase adaptador es un wrapper o contenedor, lo que bsicamente nos permite envolver (wrapp) acciones en una clase y reusar estas acciones en las situaciones adecuadas.

Factory Method Pattern. El patrn mtodo de fbrica es un patrn de diseo creacional que hace exactamente lo siguiente: Es una clase que acta como una fbrica de instancias de objetos. El principal objetivo de este patrn es encapsular el procedimiento creacional que diferentes clases pueden tener, en una sla funcin. Al proporcionar el contexto adecuado al mtodo de fbrica, ste ser capaz de devolver el objeto correcto.

Decorator Pattern. El patrn decorador es un patrn de diseo estructural que nos permite aadir comportamientos nuevos, o adicionales, a un objeto en tiempo de ejecucin, dependiendo de la situacin. El objetivo es hacerlo de tal manera que las funciones extendidas se puedan aplicar a un caso concreto y, al mismo tiempo, mantener la posibilidad de crear una instancia original que no tienen las nuevas funciones. Tambin permite combinar mltiples decoradores a una instancia, por lo que no hay que trabajar con un decorador para cada instancia. Este patrn es una alternativa a la subclase, la cual crea una clase que hereda funcionalidad de una clase padre. A diferencia de la subclase, que aade el comportamiento en tiempo de compilacin, este patrn nos permite agregar un nuevo comportamiento en tiempo de ejecucin, si la situacin as lo requiere.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Singleton Pattern. El patrn instancia nica es un patrn de diseo creacional que se asegura de tener una sola instancia de una clase particular durante su tiempo de ejecucin, y proporciona un punto de acceso global a ella. Esto permite configurar un punto de coordinacin para otros objetos que utilicen la instancia singleton; asimismo, las variables singleton siempre sern las mismas y estarn disponibles para todos los dems objetos de la aplicacin, que las llamen. Detallemos ahora un patrn de diseo importante en el desarrollo de software, el patrn de diseo MVC. Model-View-Controller design pattern (Patrn MVC (Modelo-Vista-Controlador)) Definiciones del modelo MVC son las siguientes: MVC (Modelo/Vista/Controlador) consiste en tres tipos de objetos. El Modelo es el objeto de aplicacin, la Vista es su representacin en pantalla y el Controlador define el modo en que la interfaz reacciona a la entrada del usuario. Antes de MVC, los diseos de interfaces de usuario tendan a agrupar estos objetos en uno solo. MVC los separa para incrementar la flexibilidad y reutilizacin.

Es un estilo de arquitectura de software que separa los datos de una aplicacin, la interfaz de usuario, y la lgica de control en tres componentes distintos. El estilo de llamada y retorno MVC (segn CMU), se ve frecuentemente en aplicaciones, donde la vista es el formulario y el cdigo que provee de datos dinmicos a la aplicacin. El modelo es el Sistema de Gestin de Base de Datos y la Lgica de negocio, y el controlador es el responsable de recibir los eventos de entrada desde la vista.

Figura 20. El patrn de diseo MVC.

MVC desacopla las vistas de los modelos estableciendo entre ellos un protocolo de suscripcin/notificacin. Una vista debe asegurarse de que su apariencia refleja el estado del modelo. Cada vez que cambian los datos del modelo, ste se encarga de avisar a las vistas que dependen de l. Como respuesta a dicha notificacin, cada vista tiene la oportunidad de actualizarse a s misma. Este enfoque permite asignar varias vistas a un modelo para ofrecer diferentes presentaciones. Tambin se pueden crear nuevas vistas de un modelo sin necesidad de volver a escribir ste. Entonces MVC es un patrn de diseo que considera dividir una aplicacin en tres mdulos claramente identificables y con funcionalidad bien definida: El Modelo, las Vistas y el Controlador.Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

El modelo El modelo es un conjunto de clases que representan la informacin del mundo real que el sistema debe procesar, as por ejemplo un sistema de administracin de datos climatolgicos tendr un modelo que representar la temperatura, la humedad ambiental, el estado del tiempo esperado, etc. sin tomar en cuenta ni la forma en la que esa informacin va a ser mostrada ni los mecanismos que hacen que esos datos estn dentro del modelo, es decir, sin tener relacin con ninguna otra entidad dentro de la aplicacin. El modelo desconoce la existencia de las vistas y del controlador. Ese enfoque suena interesante, pero en la prctica no es aplicable pues deben existir interfaces que permitan a los mdulos comunicarse entre s. Se podr decir que el modelo del dominio (o el modelo propiamente dicho) es el conjunto de clases que un ingeniero de software modela al analizar el problema que desea resolver; as, pertenecern al modelo del dominio: El cliente, la factura, la temperatura, la hora, etc.

Las vistas Las vistas son el conjunto de clases que se encargan de mostrar al usuario la informacin contenida en el modelo. Una vista est asociada a un modelo, pudiendo existir varias vistas asociadas al mismo modelo; as por ejemplo, se puede tener una vista mostrando la hora del sistema como un reloj analgico y otra vista mostrando la misma informacin como un reloj digital. Una vista obtiene del modelo solamente la informacin que necesita para desplegar y se actualiza cada vez que el modelo cambia. El controlador El controlador es un objeto que se encarga de dirigir el flujo del control de la aplicacin debido a mensajes externos, como datos introducidos por el usuario u opciones del men seleccionadas por l. A partir de estos mensajes, el controlador se encarga de modificar el modelo o de abrir y cerrar vistas. El controlador tiene acceso al modelo y a las vistas, pero las vistas y el modelo no conocen de la existencia del controlador.

Un ejemplo Tomemos como ejemplo una aplicacin hecha para almacenar y procesar los datos de las elecciones municipales. El modelo del dominio sera bastante simple: Un conjunto de votos, un conjunto de mesas y un conjunto de departamentos. Cada voto almacenar la seleccin hecha por el votante y la mesa donde emiti su voto. Cada mesa contendr informacin sobre el lugar de votacin y el departamento donde estara ubicada. El conjunto de vistas sobre el modelo tambin ser sencillo: Se podra obtener un grfico estadstico de votos por departamento en barras, otro grfico de votos por departamento mostrado como torta, el conjunto de votos totales en una tabla, el conjunto de votos totales en barras o en torta, etc. Como se puede ver, aunqueElaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

todas las vistas estarn mostrando la informacin de diferente manera, todas estarn asociadas al mismo modelo del dominio. El controlador se encargar de mostrar las vistas que el usuario deseara ver y de permitir al usuario introducir informacin de votos. Si el usuario deseara ver una vista, el controlador crear la vista solicitada, esta vista obtendr la informacin necesaria del modelo y la desplegar. Si el usuario aumentara informacin de votos al sistema, el controlador se encargar de actualizar la informacin contenida en el modelo del dominio que, al ser modificado, anunciar al modelo de la aplicacin la existencia de cambios y este notificar a todas sus vistas asociadas para que se actualicen. De esta manera, las vistas estarn siempre actualizadas mostrando exactamente la misma informacin contenida en el modelo. Ventajas

Desarrollar una aplicacin siguiendo este patrn de diseo tiene muchas ventajas: La aplicacin est implementada modularmente. Sus vistas muestran informacin actualizada siempre. El programador no debe preocuparse de solicitar que las vistas se actualicen, ya que este proceso es realizado automticamente por el modelo de la aplicacin. Si se desea hacer una modificacin al modelo del dominio, como aumentar mtodos o datos contenidos, slo debe modificarse el modelo y las interfaces del mismo con las vistas, no todo el mecanismo de comunicacin y de actualizacin entre modelos. Las modificaciones a las vistas no afectan en absoluto a los otros mdulos de la aplicacin. MVC es bastante utilizado en la actualidad en marcos de aplicacin orientados a objeto desarrollados para construir aplicaciones de gran tamao; Java Swing, Apache Struts, Microsoft ASP.NET, las transformaciones XSL o incluso los documentos LATEX siguen este patrn de diseo. MVC est demostrando ser un patrn de diseo bien elaborado pues las aplicaciones que lo implementan presentan una extensibilidad y una mantenibilidad nicas comparadas con otras aplicaciones basadas en otros patrones.

Desventajas

El tiempo de desarrollo de una aplicacin que implementa el patrn de diseo MVC es mayor, al menos en la primera etapa, que el tiempo de desarrollo de una aplicacin que no lo implementa, ya que MVC requiere que el programador implemente una mayor cantidad de clases que en un entorno de desarrollo comn no son necesarias. Sin embargo, esta desventaja es muy relativa ya que posteriormente, en la etapa de mantenimiento de la aplicacin, una aplicacin MVC es muchsimo ms mantenible, extensible y modificable que una aplicacin que no lo implementa. MVC requiere la existencia de una arquitectura inicial sobre la que se deben construir clases e interfaces para modificar y comunicar los mdulos de una aplicacin. Esta arquitectura inicial debe

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

incluir, por lo menos: un mecanismo de eventos para poder proporcionar las notificaciones que genera el modelo de aplicacin; una clase Modelo, otra clase Vista y una clase Controlador genricas que realicen todas las tareas de comunicacin, notificacin y actualizacin que sern luego transparentes para el desarrollo de la aplicacin.

MVC es un patrn de diseo orientado a objetos por lo que su implementacin es sumamente costosa y difcil en lenguajes que no siguen este paradigma.

Veamos un ejemplo que nos permita ver la manera en la que se implementa el patrn de diseo MVC. Ejemplo La figura 21 muestra un modelo y dos vistas (se ha dejado fuera los controladores para simplificar). El modelo contiene algunos valores de datos y las vistas que muestran estos datos de dos formas. El modelo se comunica con sus vistas cuando cambian sus valores, y las vistas se comunican con el modelo para acceder a estos.

Figura 21. Modelo de una Fraccin y dos vistas de la Fraccin en el patrn de diseo MVC.

1. Crear una aplicacin para Windows llamada WAFraccionesMVC con la interfaz mostrada en la figura 22. Los nombres para los cuadros de edicin son: txtnf1, txtdf1, txtnf2 y txtdf2. Las etiquetas en donde aparece el resultado de la suma tienen nombres: lblnfr y lbldfr. El botn de la parte superior derechaElaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

se llama btnSumar. Los botones en donde se visualizan las representaciones grficas de cada una de las fracciones (fraccin 1, fraccin 2 y fraccin resultante) se llaman btnFraccion1, btnFraccion2 y btnFraccion3, respectivamente.

Figura 22. Interfaz utilizada para la suma de dos fracciones propias

2. Editar el archivo Form1.cs como se muestra en la figura 23. En este caso, la clase Form1 es el Controlador en el patrn de diseo MVC.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Figura 23. Cdigo de la clase Controlador (Form1) de la aplicacin MVC

3. Agregar una clase al proyecto llamada ModeloFracciones y editar el archivo ModeloFracciones.cs como se indica en la figura 24.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Figura 24. La clase ModeloFracciones representa el Modelo en MVC

4. Agregar otra clase al proyecto llamada VistaFracciones y editar el archivo VistaFracciones.cs como se indica en la figura 25.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Figura 25. La clase VistaFracciones es la Vista de MVC en la aplicacin

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

II Manejo de archivos

DirectoriosBsicamente hay dos clases para manejar los directorios o carpetas de un disco duro (o cualquier disco). La diferencia entre esas dos clase: Directory y DirectoryInfo es que la primera define mtodos estticos (compartidos) y por tanto puedes usarlos sin necesidad de crear una instancia de la clase. Por otro lado, la clase DirectoryInfo es una clase de instancia, es decir, debes crear un nuevo objeto para acceder a los mtodos que define. Debido a que la clase Directory no es de instancia y por tanto te permite acceder a cualquier directorio, en los mtodos que define debes indicar el path o ruta a la que quieres acceder o con la que quieres trabajar, mientras que con DirectoryInfo debes crear una instancia indicando el directorio al que quieres acceder.

Nota: Para manipular directamente las clases de estos ejemplos debes tener una importacin del espacio de nombres System.IO que es donde estn definidas las clases para manejar todo el sistema de archivos.

Los subdirectorios de un directorioPara saber los subdirectorios de un directorio (los directorios que un directorio en concreto contiene), usaremos el mtodo GetDirectories. Aunque hay que tener en cuenta que si ese mtodo se usa desde la clase Directory, lo que devuelve es un array de tipo String, mientras que si lo usamos desde una instancia de la clase DirectoryInfo, lo que devuelve es un array del tipo DirectoryInfo. El mtodo GetDirectories tiene varias sobrecargas, en una de ellas se pueden especificar un "pattern" o especificacin para filtrar los directorios que el mtodo devuelve. Ver el cuadro "Caracteres comodines" para saber ms sobre la especificacin a usar. Caracteres comodines: En las especificaciones o patterns de algunos de los mtodos, se pueden usar los caracteres comodines * y ?. El asterisco (*) indica cualquier carcter o caracteres, mientras que la interrogacin (?) se puede usar para indicar "cualquier carcter en esa posicin". Por ejemplo: datos* buscar todo lo que empiece con la palabra datos: datos07 o datosAbril, pero no misdatos, datos??07 buscar todo lo que empiece con la palabra datos, tenga dos caracteres cualesquiera en las posiciones 6 y 7 y termine con 07: datos0107, pero no datos01abr07. En las especificaciones no se distinguen las maysculas de las minsculas, por tanto DatOS ser lo mismo que DATOS o datos.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Los ficheros de un directorioPara averiguar los ficheros que contiene un directorio, usaremos el mtodo GetFiles. Aunque hay que tener en cuenta que si ese mtodo se usa desde la clase Directory, lo que devuelve es un array de tipo String, mientras que si lo usamos desde una instancia de la clase DirectoryInfo, lo que devuelve es un array del tipo FileInfo. El mtodo GetFiles tiene varias sobrecargas, en una de ellas se pueden especificar un "pattern" o especificacin para filtrar los ficheros que el mtodo devuelve. Esa especificacin solo puede contener un tipo, por ejemplo, si quieres recuperar todos los ficheros con la extensin .txt puedes usar *.txt, pero si quieres todos los ficheros que tengan la extensin .txt y todos los que tengan la extensin .doc no puedes usar *.txt; *.doc, sino que tendrs que hacerlo para un tipo cada vez.

Ejemplo

class FileSysInfo { static void Main() { // You can also use System.Environment.GetLogicalDrives to // obtain names of all logical drives on the computer. System.IO.DriveInfo di = new System.IO.DriveInfo(@"C:\"); Console.WriteLine(di.TotalFreeSpace); Console.WriteLine(di.VolumeLabel);

// Get the root directory and print out some information about it. System.IO.DirectoryInfo dirInfo = di.RootDirectory; Console.WriteLine(dirInfo.Attributes.ToString());

// Get the files in the directory and print out some information about them. System.IO.FileInfo[] fileNames = dirInfo.GetFiles("*.*");

foreach (System.IO.FileInfo fi in fileNames)

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

{ Console.WriteLine("{0}: {1}: {2}", fi.Name, fi.LastAccessTime, fi.Length); }

// Get the subdirectories directly that is under the root. // See "How to: Iterate Through a Directory Tree" for an example of how to // iterate through an entire tree. System.IO.DirectoryInfo[] dirInfos = dirInfo.GetDirectories("*.*");

foreach (System.IO.DirectoryInfo d in dirInfos) { Console.WriteLine(d.Name); }

// The Directory and File classes provide several static methods // for accessing files and directories.

// Get the current application directory. string currentDirName = System.IO.Directory.GetCurrentDirectory(); Console.WriteLine(currentDirName);

// Get an array of file names as strings rather than FileInfo objects. // Use this method when storage space is an issue, and when you might // hold on to the file name reference for a while before you try to access // the file. string[] files = System.IO.Directory.GetFiles(currentDirName, "*.txt");

foreach (string s in files) { // Create the FileInfo object only when needed to ensure

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

// the information is as current as possible. System.IO.FileInfo fi = null; try { fi = new System.IO.FileInfo(s); } catch (System.IO.FileNotFoundException e) { // To inform the user and continue is // sufficient for this demonstration. // Your application may require different behavior. Console.WriteLine(e.Message); continue; } Console.WriteLine("{0} : {1}",fi.Name, fi.Directory); }

// Change the directory. In this case, first check to see // whether it already exists, and create it if it does not. // If this is not appropriate for your application, you can // handle the System.IO.IOException that will be raised if the // directory cannot be found. if (!System.IO.Directory.Exists(@"C:\Users\Public\TestFolder\")) { System.IO.Directory.CreateDirectory(@"C:\Users\Public\TestFolder\"); }

System.IO.Directory.SetCurrentDirectory(@"C:\Users\Public\TestFolder\");

currentDirName = System.IO.Directory.GetCurrentDirectory();

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Console.WriteLine(currentDirName);

// Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } }

Archivos

La manera de almacenar y recuperar informacin que perdure en el tiempo se basa en el uso de memoria secundaria, compuesta esencialmente por discos (diskettes, discos duros, CD, DVD, etc.) y ocasionalmente cintas. En cualquiera de estos medios, la unidad de almacenamiento de informacin se denomina archivo.

Streams

La lectura y escritura a un archivo son hechas usando un concepto genrico llamado stream. La idea detrs del stream existe hace tiempo, cuando los datos son pensados como una transferencia de un punto a otro, es decir, como un flujo de datos. En el ambiente .NET se puede encontrar muchas clases que representan este concepto que trabaja con archivos o con datos de memoria (como se muestra en la siguiente figura).

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Figura 1. Clases del Framework .NET para el uso de Streams.

Un stream es como se denomina a un objeto utilizado para transferir datos. Estos datos pueden ser transferidos en dos posibles direcciones:

- Si los datos son transferidos desde una fuente externa al programa, entonces se habla de leer desde el stream. - Si los datos son transferidos desde el programa a alguna fuente externa, entonces se habla de escribir al stream.

Frecuentemente, la fuente externa ser un archivo, pero eso no necesariamente es el caso, por lo que el concepto es utilizado ampliamente con fuentes de informacin externas de diversos tipos. Algunas otras posibilidades fuera de los archivos incluyen:

- Leer o escribir datos a una red utilizando algn protocolo de red, donde la intencin es que estos datos sean recibidos o enviados por otro computador. - Lectura o escritura a un rea de memoria.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

- La Consola - La Impresora - Otros

Algunas clases que C# provee para resolver este acceso a fuentes diversas incluyen las clases de tipo: Reader y Writer.

BufferedStream

Esta clase se utiliza para leer y para escribir a otro stream.

El uso de streams para la lectura y escritura de archivo es directa pero lenta. Por esta razn la clase BufferedStream existe y es ms eficiente. Puede ser utilizado por cualquier clase de stream. Para operaciones de archivo es posible utilizar FileStream, donde el buffering est ya incluido.

Las clases ms relacionadas con la escritura y lectura de archivos (File Input/Output o File I/O) son:

FileStream, cuyo propsito es lectura y escritura de datos binarios (no de texto legible), a cualquier archivo de tipo binario, aunque se puede utilizar para acceder a cualquier tipo de archivo, inclusive los de texto.

StreamReader y StreamWriter, las cuales estn diseadas para lectura y escritura de archivos de texto. Estas clases se asumen como de un nivel ms alto que FileStream.

Una observacin acerca de la declaracin de nombres/rutas de archivos en C#. Usualmente, la ruta de un archivo contiene el carcter \, que en C# se utiliza como carcter de control para smbolos especiales (como el cambio de lnea: \n).

Sin embargo, entendiendo que no es el mismo sentido el que se le quiere dar en la interpretacin de rutas de archivos (por Ej.: C:\Mis documentos\Programas\ejemplo.cs), se utiliza una sintaxis particular, anteponiendo el smbolo @ antes del string con la ruta del archivo. Es decir:

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

string rutaarchivo = @C:\Temp\archivo.txt;

Esta declaracin evita la interpretacin de los dos caracteres \ como smbolos especiales y el string queda correctamente inicializado.

Using System.IO

Para el uso de estas clases, es necesario referenciar el uso del namespace System.IO, ya que System no contiene los elementos para el manejo de archivos. Por ello, los programas con acceso a archivos deben incluir la lnea:

using System.IO;

Constructores de StreamReader

El ms simple de los constructores toma slo el nombre/ruta del archivo a abrir para lectura:

StreamReader sr = new StreamReader(@C:\Temp\archivo.txt);

Sin embargo, reconociendo que hoy existen diferentes formatos (codificaciones) de archivos de texto y no solamente el tradicional formato ASCII, es factible establecer cul es la codificacin especial que este archivo de texto plano puede tener. Los formatos posibles son: ASCII, Unicode, UTF7, UTF8, BigEndianUnicode.

El constructor ad-hoc es: StreamReader sr = new StreamReader(@C:\Temp\file.txt, Encoding.UTF8Encoding);

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

En trminos prcticos, nos ser necesario recurrir a este tipo de codificaciones, ya que usualmente se trabajar con codificacin ASCII.

El constructor deja abierto el stream para poder recuperar la informacin del archivo desde la instancia de StreamReader declarada. Para cerrar un stream o archivo, se invoca el mtodo Close():

sr.Close();

Lectura con StreamReader

Son bsicamente tres los mtodos propios de StreamReader que permiten efectuar lectura desde el stream (archivo) declarado.

ReadLine()

Al igual que el conocido Console.ReadLine(), este mtodo lee una lnea completa de un archivo de texto hasta el cambio de lnea ms prximo. Al igual que su equivalente de consola, StreamReader.ReadLine() no incluye en el string el carcter de cambio de lnea.

string linea = sr.ReadLine();

ReadToEnd()

Este mtodo, por su parte, se encarga de acumular la informacin que hay desde la lectura anterior (que pudo haberse hecho con ReadLine(), por ejemplo) hasta el final del archivo, todo en el mismo string.

string linea = sr.ReadToEnd();

Read () Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Finalmente, el mtodo simple Read() se encarga de leer un caracter a la vez, lo que permite procesar smbolo por smbolo el contenido del archivo. Convenientemente, este mtodo reconoce el cambio de lnea y se lo salta como si no existiese. Cuando se encuentra con el fin de archivo, retorna un valor 1, considerando que su retorno es siempre un int (y no un char).

int SigCaracter = sr.Read();

Este mismo mtodo ofrece una declaracin alternativa (sobrecarga), donde es posible leer una cantidad especfica de caracteres y almacenarlos en un arreglo de enteros.

char[] CharArray = new char[100]; int[] nChars = sr.Read(CharArray, 0, 100);

nChars es un arreglo con los enteros retornados por el mtodo, y ser menor si es que la cantidad de caracteres que quedan en el archivo es menor de 100.

Escritura: StreamWriter

Esta clase funciona prcticamente de la misma manera que StreamReader, excepto que su propsito es nicamente para escribir dentro de un archivo (u otro stream). Es relevante distinguir que en este caso, el proceso de apertura para escritura considera que:

Si el archivo no existe lo crea vaco para comenzar a escribir. Si el archivo ya existe, lo deja vaco para comenzar a escribir. Si el archivo ya existe, es posible abrirlo en forma Append (agregar) para escribir al final.

Constructores de StreamWriter

El ms simple de los constructores toma slo el nombre/ruta del archivo a abrir para escritura.

StreamWriter sw = new StreamWriter (@C:\Temp\archivo.txt);

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Este constructor asume por defecto el formato UTF8 de archivos planos, ya que es el manejado por .NET. Sin embargo, existe el constructor equivalente que permite abrir un archivo especificando otra codificacin de archivo plano, por ejemplo ASCII.

StreamWriter sw = new StreamWriter (@C:\doc\file.txt, Encoding.ASCII);

Un tercer constructor utiliza como segundo parmetro un boolean que indica si el archivo debe ser abierto para Agregar, es decir, en un modo Append.

StreamWriter sw = new StreamWriter (@C:\Temp\archivo.txt, true);

De la misma manera que en el caso de la lectura, para cerrar un stream o archivo, se invoca el mtodo

Close: sw.Close();

Escritura con StreamWriter

Son bsicamente dos los mtodos propios de StreamWriter que permiten escribir hacia el stream (archivo) declarado y son los mismos que se usan para escribir en la consola: Write() y WriteLine().

WriteLine()

Totalmente equivalente a Console.WriteLine(), se utiliza la misma idea, y el mismo formato, sabiendo que se estar escribiendo el texto no a la consola, sino que al stream abierto con el constructor.

string linea = Texto de prueba; sw.WriteLine(linea); sw.WriteLine(Los valores posibles son: {0} y {1}, 3, 5);

Write () Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Tambin presente, el mtodo simple Write(), permite escribir texto en el stream, de la misma forma que su equivalente mtodo de la clase Console. En este caso se reconocen las siguientes alternativas de uso:

Imprimir un stringstring linea = Texto de prueba; sw.Write(linea);

Imprimir un caracterchar caracter = T; sw.Write(caracter);

Imprimir un arreglo de caractereschar[] caracteres = new char[100]; for(int i=0; i 25000

Ejemplo 12. Obtener los pedidos superiores a $25000 mostrando el nombre del cliente que los orden, el vendedor asociado al cliente y la oficina donde el vendedor trabaja. Solucin SELECT num_pedido, importe, empresa, nombre, ciudad FROM PEDIDOS, CLIENTES, REPVENTAS, OFICINAS WHERE clie = num_clie AND rep_clie =num_empl AND oficina_rep = oficina AND importe >=25000Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Ejemplo 13. Obtener la cuota promedio, las ventas promedio y el rendimiento de cuota promedio de los vendedores. Solucin SELECT AVG(cuota), AS [CUOTA PROMEDIO], AVG(ventas), AS [VENTAS PROMEDIO], AVG(100*(ventas/cuota)) AS [RENDIMIENTO DE CUOTA PROMEDIO] FROM REPVENTAS Ejemplo 14. Obtener el mejor rendimiento de ventas de todos los vendedores. Solucin SELECT MAX(100*(ventas/cuota)) AS [RENDIMIENTO PTIMO DE VENTAS] FROM REPVENTAS Ejemplo 15. Obtener las cuotas y ventas totales para todos los vendedores, as como su cuota mxima y mnima. Solucin SELECT SUM(cuota) AS [IMPORTE TOTAL], SUM(ventas) AS [VENTAS TOTALES], MIN(couta) AS [CUOTA MNIMA], MAX(cuota) AS [CUOTA MXIMA] FROM REPVENTAS Ejemplo 16. Obtener el nmero de pedidos con importe superior a $35000 Solucin SELECT COUNT(*) AS [PEDIDOS] FROM PEDIDOS WHERE importe > 35000

Ejemplo 17. Obtener el nmero de vendedores asignados a cada oficina Solucin SELECT oficina_rep AS [OFICINA], COUNT(*), AS [No VENDEDORES] FROM REPVENTAS GROUP BY oficina_rep Ejemplo 18. Obtener los pedidos totales por cada vendedor SolucinElaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

SELECT num_empl AS [EMPLEADO], nombre, SUM(importe) AS [PEDIDO TOTAL] FROM PEDIDOS, REPVENTAS WHERE rep = num_empl GROUP BY num_empl, nombre Ejemplo 19. Suprimir los pedidos aceptados por Sue Smith. Solucin DELETE FROM pedidosFROM PEDIDOS, REPVENTAS WHERE rep = (SELECT num_empl FROM repventas WHERE nombre = Sue Smith) Ejemplo 20. Elevar en $5000 el lmite de crdito de cualquier cliente que haya remitido una orden de $10000 UPDATE clients SET limite_credito = limite_credito + 5000 WHERE num_cli IN (SELECT DISTINC clie FROM pedidos WHERE importe >= 10000)

En este punto mencionemos que queda abierto al profesor la implementacin de un sistema que haga uso de procedimientos almacenados con un diseo multitabla utilizando las estructuras de programacin vistas en apartados anteriores.

Reportes en .NET con Crystal ReportsVisual Studio .NET incluye Crystal Reports como un mecanismo "oficial" de creacin de reportes. Crystal Reports es un producto muy desarrollado y complejo para la creacin de reportes, y cuenta con una infinidad de opciones. En este artculo, nos vamos a concentrar en crear reportes relativamente sencillos, pero mostrando los detalles especficos de la versin .NET, tanto en aplicaciones WinForms como en aplicaciones WebForms (ASP.NET). Este artculo considera que usted ya posee alguna familiaridad con Visual Studio .NET y tambin con ADO.NET.

Crear un reporteIndependientemente de cmo se har la presentacin, el reporte se define en un archivo ".RPT", que forma parte de su proyecto. Ese archivo especifica el modo en que se har la presentacin del reporte, pero no incluye los datos propiamente dichos. Los datos se definirn en el tiempo de ejecucin. Crystal Reports se basa en un concepto muy comn de la definicin de reportes: los reportes se componen de "secciones", y cada seccin es un espacio horizontal en la pgina. Existen diversos tipos de secciones, por ejemplo: Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Encabezado del reporte, aparece en la primera pgina. Encabezado de pgina, aparece en la parte superior de todas las pginas. Detalle: lo ms importante. En el tiempo de ejecucin, se genera una de estas secciones para cada lnea (registro) en la base de datos. Pie de pgina, aparece en la parte inferior de todas las pginas. Pie de reporte, aparece al final del reporte.

En un principio, todos los reportes presentan estas cinco secciones. Otras secciones son opcionales, como por ejemplo:

Encabezado de grupo, aparece antes de un grupo. Pie de grupo, aparece al final del grupo.

Se podr omitir una o ms secciones, en caso de que no sean necesarias.

Acceder a la base de datosAntes de crear el reporte, hay que decidir cul ser el mecanismo utilizado para acceder a la base de datos. Crystal Reports puede obtener datos de una infinidad de fuentes, pero una buena cantidad de ellas, como DAO, ADO y OLE/DB, no est "administrada", o sea, es cdigo .NET "puro". En una aplicacin .NET, probablemente sea deseable realizar el acceso a travs de ADO.NET. Para ello, lo ms fcil es definir un Conjunto de datos tipificado, aun antes de crear el reporte.

Crear un proyectoVeamos cmo crear un reporte en un programa WinForms. Inicialmente, genere un proyecto en C# de tipo "Windows Application". Vamos a definir ahora el acceso a la base de datos. Como ejemplo, vamos a acceder a la base de datos "Northwind", que se encuentra como ejemplo en SQL Server. Siga la siguiente ruta:

Agregue un componente de tipo SqlDataAdapter. Seleccione la conexin con la base Northwind. Introduzca el comando SQL "select * from Products order by CategoryID, ProductName" Haga clic con el botn alterno del mouse sobre el componente DataAdapter, seleccione "Create DataSet" y acepte el nombre sugerido ("DataSet1").

Ahora, agregaremos un reporte al proyecto. Haga clic en "Proyecto | Agregar elemento nuevo" y seleccione "Crystal Report":

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Acepte el nombre "CrystalReport1.rtp", al presionar Intro. Crystal Reports mostrar un asistente. Marque "Usar el Experto en reportes" y "Estndar":

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

En este momento, cabe hacer algunos comentarios:

El asistente puede ayudarle a crear diversos tipos de reportes, pero vamos a explorar solamente algunas posibilidades ms sencillas. Puede probar despus con otros tipos de reportes; Crystal Reports pedir que realice el registro de su copia; mostramos el uso con una copia ya registrada.

Presione "Aceptar" para pasar a la pantalla siguiente para la eleccin de la fuente de los datos. Seleccione la tabla "Productos" a partir del Conjunto de datos creado y haga clic en "Insertar tabla":

Haga clic en "Siguiente" y seleccione las columnas que aparecern en el reporte:

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Haga clic en "Siguiente" y defina un grupo haciendo clic en la columna "CategoryID" al lado izquierdo, y despus en "Agregar":

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Las dems opciones no nos interesan en este reporte sencillo. Haga clic en "Finalizar", para crear el reporte:

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Observe lo siguiente:

El reporte tiene siete secciones; las cinco obligatorias y dos ms relativas al grupo. La seccin "Encabezado del reporte" tiene la propiedad Suprimir con el valor verdadero, indicando que no aparecer en el tiempo de ejecucin. Puede editar cuantas veces quiera el reporte creado, al agregar componentes o modificar los que hayan sido colocados.

Las secciones contienen componentes que se pueden obtener en dos lugares:

Pgina "Crystal Reports" de la Caja de herramientas, si se trata de textos fijos, lneas y cajas. "Explorador de campos", en el caso de campos de la base de datos, frmulas, totales, grupos y otros datos especficos del reporte, como fecha, hora y numeracin de pginas.

Presentar el reporteUna vez definido el reporte, hay que presentarlo al tiempo de ejecucin. Para ello, coloque un componente "CrystalReportViewer" en el formato y seleccione la propiedad "Acoplar" para "Llenar". Slo se necesita un componente "Visualizador", aun cuando se hayan creado diversos reportes en archivos RPT separados. Para producir el reporte, agregue un componente "Men principal" y aada un elemento de men para producir el reporte. Aada el siguiente cdigo al evento Clic del botn:private void menuItem2_Click(object sender, System.EventArgs e) { // Ejecuta la consulta a la base dados sqlDataAdapter1.Fill(dataSet11); // Crea el reporte CrystalReport1 Rel = new CrystalReport1(); // Asocia el conjunto de datos con el reporte Rel.SetDataSource(dataSet11); // Asocia el reporte con el Visualizador crystalReportViewer1.ReportSource = Rel; }

Una vez presentado, puede cambiar el tamao en el botn "aumentar", ir a otra pgina o hacer clic del lado izquierdo para solicitar la presentacin de algn grupo en particular:

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

El usuario puede hacer clic en el botn con el icono de la impresora para imprimir el reporte.

Presentar en el WebPara utilizar el reporte en un proyecto Web, cree un nuevo proyecto de tipo "Aplicacin Web ASP.NET" y agregue un reporte exactamente como se mostr anteriormente. Aada al formato un componente CrystalReportsViewer de la pgina "WebForms" de la Caja de herramientas. Aada el siguiente cdigo al evento Page_Load: Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

private void Page_Load(object sender, System.EventArgs e) { // Ejecuta la consulta a la base de datos sqlDataAdapter1.Fill(dataSet11); // Crea el reporte CrystalReport1 Rel = new CrystalReport1(); // Asocia el conjunto de datos con el reporte Rel.SetDataSource(dataSet11); // Asocia el reporte con el Visualizador CrystalReportViewer1.ReportSource = Rel; }

La pgina Web mostrada es la siguiente:

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Cabe sealar que la interfaz es similar a la del programa WinForms que se mostr anteriormente, lo que permite cambiar de pgina, de valor de grupo y de valor de aumento.

Ejemplo La figura 26 muestra un modelo y dos vistas. El modelo contiene la estructura de una tabla en SQL Server y las vistas muestran los registros almacenados en la tabla de dos formas.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Figura 26. Modelo de un Acceso a Datos mediante una Consulta (select * from Alumnos) y dos vistas de dicha Consulta en el patrn de diseo MVC

Veamos otro ejemplo que nos permita ver la manera en la que se implementa el patrn de diseo MVC: 1. Crear una base de datos llamada Universidad y una tabla en dicha base de datos cuyo nombre sea Alumnos de acuerdo a la estructura mostrada en la figura 27.

Figura 27. Estructura de la tabla Alumnos

2. Agregar registros a la tabla Alumnos de acuerdo con la figura 28.

Figura 28. Contenido de la tabla Alumnos despus de agregar 5 registros

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

3. Crear una aplicacin para Windows llamada WAAccesoMVC con la interfaz mostrada en la figura 29. Los nombres para los controles ComboBox, ListBox y DataGridView son comboBox1, listBox1 y dataGridView1, respectivamente.

Figura 29. Interfaz utilizada para la visualizacin de una consulta

4. Editar el archivo Form1.cs como se muestra en la figura 30. En este caso, la clase Form1 es el Controlador en el patrn de diseo MVC.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Figura 30. Cdigo de la clase Controlador (Form1) de la aplicacin MVC

5. Agregar una clase al proyecto llamada ModeloBDSQL y editar el archivo ModeloBDSQL.cs como se indica en la figura 31.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Figura 31. La clase ModeloBDSQL representa el Modelo en MVC

6. Agregar otra clase al proyecto llamada VistaBDSQL y editar el archivo VistaBDSQL.cs como se indica en la figura 32.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Figura 32. La clase VistaBDSQL es la Vista de MVC en la aplicacin

7. Ejecutar la aplicacin, seleccionar del ComboBox las opciones presentadas y observar las vistas resultantes (ver figura 33).

Figura 33. Resultado de la aplicacin WAAccesoMVC

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

IV. Desarrollo MulticapaIntroduccin a la programacin Multicapas

Resumen: El modelo actual de desarrollo de software nos ha comprobado que el organizar los elementos de las aplicaciones en componentes independientes puede lograr una mayor efectividad a la hora de administrarlas.

Introduccin La programacin en mltiples capas es la tcnica ms efectiva en aplicaciones empresariales, debido a la fcil administracin que implica el dividir los componentes de la aplicacin en capas y la rapidez que esto implica en programas orientados a Cliente-Servidor. Esta arquitectura consiste en dividir los componentes primarios de la aplicacin, programarlos por separado y despus unirlos en tiempo de ejecucin. El modelo COM de objetos es uno de los pilares de la programacin Multitier (multicapa).

Qu es Programacin Multitier?

Cmo lo deca en el apartado anterior, la programacin multitier consiste en dividir los componentes primarios de la aplicacin, programarlos por separado y luego unirlos sea en tiempo de ejecucin o en el mismo cdigo. De esto naturalmente surge una duda Cules son los componentes primarios de la aplicacin? En este momento se habla de programacin de cuatro capas, aunque me referir a la programacin en tres capas o Three-Tier que es el ms documentado y que en este momento permite mayor abstraccin para aplicaciones empresariales. Estas tres capas las podemos denominar como: Presentacin, Reglas del Negocio y Acceso a Datos. A continuacin las explico cada una: Presentacin:

Esta capa es la que ve el usuario, presenta el sistema al usuario, le comunica la informacin y captura la informacin del usuario en un mnimo de proceso. En esta capa se disea todo lo que constituye la interfaz grfica y la interaccin del usuario con el software.Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Esta capa se comunica con la capa de negocio y con la capa de datos.

Capa de Negocio Aqu es donde, se reciben las peticiones del usuario y se envan las respuestas tras el proceso. Se denomina capa de negocio (e incluso de lgica del negocio) porque es aqu donde se establecen todas las reglas que deben cumplirse. Esta capa se comunica con la capa de presentacin, para recibir las solicitudes y presentar los resultados, y con la capa de datos, para solicitar al gestor de base de datos para almacenar o recuperar datos de l.

Reglas del Negocio: Son todas las subrutinas creadas con el propsito de regular alguna accin del usuario. Por ejemplo, en una aplicacin bancaria una regla del negocio podra ser que el cliente no debe retirar por taquilla ms de U.S. $10.000 y en caso de una peticin de este tipo se genere un error, otro ejemplo podra ser en un sistema de pedidos que tal producto de la marca X tenga un descuento, entonces habr que aplicar ese descuento cuando se calcule su pago.

Acceso a Datos: En esta capa programamos todo lo que tiene que ver con el acceso a la base de datos. Esta capa queda encargada de tomar la informacin de la base de datos dada una peticin de la capa de Reglas del Negocio, que a su vez es generada por la capa de presentacin.

Cul es la diferencia con la programacin tradicional?

Probablemente se estar preguntando, Por qu esto es mejor que programar todo de una sola vez y qu diferencia hay entre una arquitectura y otra? Las grficas nos ayudarn a visualizar mejor estas diferencias. MODELO TRADICIONAL

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Todas las capas estn ubicadas en un nico elemento y al actualizar un elemento se tendrn que afectar todos.

MODELO THREE-TIER

En ste, el cambio en la capa de presentacin no afectar reglas del negocio y se pueden actualizar las funciones de reglas del negocio sin tener que cambiar el acceso a datos. Como podemos apreciar en las grficas, resulta mucho ms prctico programar las capas por separado, sobretodo en situaciones que tenemos un equipo de trabajo de diferentes programadores o el proyecto es para una empresa con varias sucursales con polticas independientes. Cmo funciona en Visual Studio .NET? En este entorno de programacin existen muchas ayudas para aplicaciones multitier. Una de ellas es los denominados Building Blocks, dentro de los cuales existen plantillas para cada una de las capas. Pero no es necesario utilizarlos; perfectamente nosotros podemos hacer el trabajo, aqu voy a mencionar algunas recomendaciones. Gracias a .NET podemos utilizar clases para dividir todos los componentes; simplemente se debe encapsular los elementos importantes en objetos, por ejemplo: los usuarios se pueden convertir en una clase, los depsitos pueden ser una clase, las transacciones las podemos convertir en clases y as sucesivamente. Cundo es recomendable utilizar esta arquitectura? Lo recomendable para utilizar la arquitectura multitier es:Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Cuando el proyecto es muy grande. Cuando son varios los programadores y existen dificultades para coordinarlos, por ejemplo cuando el software se est desarrollando con programadores freelance que estn muy lejos unos de los otros. Cuando el programa es para una empresa con varias sucursales y cada sucursal puede tener algunos mtodos y polticas diferentes. Por ejemplo, una empresa tiene una sucursal en Los Angeles y otra en Boston; la sucursal de Los Angeles slo permite compras a crdito por un valor de $10,000 y la de Boston de $12,000. Al utilizar un modelo multitier en este caso podemos cambiar el lmite del crdito sin tocar la capa de presentacin ni la de acceso a datos.

En este ejemplo, lo que muestro es que en nuestro formulario (fig. 1) lo nico que debemos tener es el cdigo para invocar a las funciones creadas para el acceso a datos CLASE DATOS y el cdigo para invocar a las funciones creadas para realizar los clculos de las reglas del negocio CLASE CAPA NEGOCIO; no sus implementaciones ya que estas las tenemos en las respectivas clases. El siguiente ejemplo trata la elaboracin de un pedido y la consulta de los productos de un pedido en particular. Elabora el siguiente formulario, se pretende que al cargarse el formulario, la fecha de Pedido se tome del sistema y la muestre, adems la fecha de entrega sea 5 das despus de la fecha de Pedido que le sume esos das y la muestre. Adems el comboBox deber llenarse con el campo nombre de la tabla inventario (fig. 2), de la Base de Datos Ferreteria. Se incluir un evento para que cuando el usuario seleccione su producto se muestre la marca y el precio de ese producto. El usuario tendr que capturar la cantidad deseada y al presionar el botn Calcular se mostrar el SubTotal es en este proceso que se utiliza la clase capaNegocio, en el botn Agregar a mi pedido, tiene la funcin de insertar en la tabla Pedidos (fig. 2) los datos del pedido como la clave de pedido, clave del cliente,fecha de Pedido y fecha de entrega que toma de los respectivos textBox(txtCvePedido, txtCveCli, txtFechaElaboracion, txtFechaEntrega). Y en la tabla PedidoProductos (fig. 2) insertar la cantidad, nombreProducto, marca, precio y subtotal). Pasos. 1. 2. 3. 4. 5. 6. 7. Elabora la Base de Datos Ferretera. Elabora las tablas Inventario, Pedidos y PedidoProductos. Fig. 2 Elabora la clase Datos, st ya se utiliz en ejercicios anteriores. Fig. 3. Elabora la clase CapaNegocio. Fig 4 Disea la interfaz ELABORACIN DE PEDIDO fig.1. Programa la capa de presentacin. Disea la interfaz CONSULTA DE PEDIDO. Fig 5

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Fig. 1

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Fig. 2class Datos2 { private SqlDataReader dr; private SqlConnection conn; private SqlCommand cadena_sql; private SqlDataAdapter adapt; public bool conectar() { conn = new SqlConnection(); conn.ConnectionString = @"Data Source=rosariotitla-pc\SQLEXPRESS;Initial Catalog=ferreteria;Integrated Security=True"; try { conn.Open(); return true; } catch (Exception oEx) { MessageBox.Show(oEx.Message); return false; } } public void desconectar() { conn.Close(); } public SqlDataAdapter construye_adapter(string cadena) { adapt = new SqlDataAdapter(cadena, conn); return (adapt); } public SqlCommand construye_command(string cadena) { cadena_sql = new SqlCommand(cadena, conn); return (cadena_sql); } public int ejecutanonquery() { int afectados; try { afectados = cadena_sql.ExecuteNonQuery(); return (afectados); } catch (Exception oEx) { MessageBox.Show(oEx.Message); return (0); } } public DataRow extrae_registro(SqlDataAdapter adapter) { DataSet ds; DataRow fila; ds = new DataSet(); try { adapter.Fill(ds, "inventario"); DataTable miTabla = ds.Tables["inventario"]; fila = miTabla.Rows[0]; return (fila); }catch (Exception oEx) { MessageBox.Show(oEx.Message); return (null); } } public DataSet extrae_registros(SqlDataAdapter adapter) { DataSet ds; ds = new DataSet(); try { adapter.Fill(ds, "inventario"); return (ds); } catch (Exception oEx) { MessageBox.Show(oEx.Message); return (null); } } public void construye_reader(string cadena) { cadena_sql = new SqlCommand(); cadena_sql.Connection = conn; cadena_sql.CommandText = cadena; cadena_sql.CommandType = CommandType.Text; }

Elaborada } Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos por:

public SqlDataReader ejecuta_reader() { try { dr = cadena_sql.ExecuteReader(); return dr; } catch (Exception oEx) { MessageBox.Show(oEx.Message); return null; } }

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Evento que muestra el precio y la marca al seleccionar el producto del comboBox llamado cbNombre

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Comunicacin Cliente-Servidor (Socket)EL origen de los sockets tuvo lugar en una variante del sistema operativo Unix conocida como BSD Unix. En la universidad de Berkeley, en los inicios del Internet, pronto se hizo evidente que los programadores necesitaran un medio sencillo y eficaz para escribir programas capaces de intercomunicarse entre s. Esta necesidad dio origen a la primera especificacin e implementacin de sockets.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Cliente-Servidor es el modelo que actualmente domina el mbito de comunicacin, ya que descentraliza los procesos y los recursos. Es un Sistema donde el cliente es una aplicacin, en un equipo, que solicita un determinado servicio y existe un software, en otro equipo, que lo proporciona.

Los servicios pueden ser:

a) Ejecucin de un programa. b) Acceso a una Base de Datos. c) Acceso a un dispositivo de hardware.

Solo se requiere un medio fsico de comunicacin entre las maquinas y depender de ala naturaleza de este medio la vialidad del sistema.

Definicin de Socket Designa un concepto abstracto por el cual dos programas (posiblemente situados en computadoras distintas) pueden intercambiarse cualquier flujo de datos, generalmente de manera fiable y ordenada.

Los sockets proporcionan una comunicacin de dos vas, punto a punto entre dos procesos. Los sockets son muy verstiles y son un componente bsico de comunicacin entre interprocesos e intersistemas. Un socket es un punto final de comunicacin al cual se puede asociar un nombre.

Para lograr tener un socket es necesario que se cumplan ciertos requisitos:

1. Que un programa sea capaz de localizar al otro. 2. Que ambos programas sean capaces de intercambiarse informacin.

Por lo que son necesarios tres recursos que originan el concepto de socket:

a) Un protocolo de comunicaciones, que permite el intercambio de octetos. b) Una direccin del Protocolo de Red (Direccin IP, si se utiliza el Protocolo TCP/IP), que identifica una computadora. Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

c) Un nmero de puerto, que identifica a un programa dentro de una computadora. Con un socket se logra implementar una arquitectura cliente-servidor. La comunicacin es iniciada por uno de los programas (cliente). Mientras el segundo programa espera a que el otro inicie la comunicacin (servidor). Un Socket es un archivo existente en el cliente y en el servidor.

Si un socket es un punto final de un puente de comunicaron de dos vas entre dos programas que se comunican a travs de la red, Cmo funciona? Normalmente, un servidor funciona en una computadora especfica usando un socket con un nmero de puerto especfico. El cliente conoce el nombre de la maquina (hostname) o el IP, en la cual el servidor esta funcionando y el numero del puerto con el servidor esta conectado.

Si el cliente lanza una demanda de conexin y el servidor acepta la conexin, este abre un socket en un puerto diferente, para que pueda continuar escuchando en el puerto original nuevas peticiones de conexin, mientras que atiende a las peticiones del cliente conectado. El cliente y el servidor pueden ahora comunicarse escribiendo o leyendo en sus respectivos sockets.

Figura 1. Proceso de comunicacin entre un servidor y un cliente Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Los tipos de socket definen las propiedades de comunicacin visibles para la aplicacin. Los procesos se comunican solamente entre los sockets del mismo tipo.

El Cliente acta de la siguiente forma:

1) Establece una conexin con el servidor (crea un socket con el servidor). 2) Mandar mensajes al servidor o esperar un mensaje de l (Consultas). 3) Esperar su respuesta o contestarle (existen casos en que este paso no es necesario). 4) Repetir los pasos 2 y 3 mientras sea necesario. 5) Cerrar la conexin con el servidor.

El servidor acta as:

1) Inicializa un puerto de comunicacin, en espera de clientes que intenten conectarse a l (Crea un serverSocket).

2) Una vez que se conecta alguien, crea un hilo de ejecucin para este usuario mientras que el thread (Hilo) principal vuelve al paso 1. Esto comnmente se hace para que el servidor pueda atender a varios clientes al mismo tiempo.

3) Se comunica con el cliente mediante el socket creado entre el cliente y l.

4) Espera que el cliente se vaya o lo bota el mismo servidor (cierra el socket entre ellos) y elimina el thread de comunicacin entre ellos.

Las propiedades de un socket dependen de las caractersticas del protocolo en el que se implementan. El protocolo ms utilizado es TCP, aunque tambin es posible utilizar UDP o IPX. Gracias al protocolo TCP, los sockets tienen las siguientes propiedades:

I. Orientado a conexin. Se garantiza la transmisin de todos los octetos sin errores ni omisiones. II. Se garantiza que todo octeto llegar a su destino en el mismo orden en que se ha transmitido. Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Los tipos de socket definen las propiedades de comunicacin visibles para la aplicacin. Los procesos se comunican solamente entre los sockets del mismo tipo. Existen tres tipos bsicos de sockets:

Socket de flujo: da un flujo de datos de dos vas, confiable, y sin duplicados sin lmites de grabacin. El flujo opera en forma parecida a una conversacin telefnica. El tipo del socket es SOCK_STREAM, el cual en el dominio de Internet usa TCP (Transmission Control Protocol).

Socket de datagrama: soporta un flujo de mensajes de dos vas. En un socket de datagrama podra recibir mensajes en diferente orden de la secuencia de la cual los mensajes fueron envados. Los lmites de grabacin en los datos son preservados. Los sockets de datagrama operan parecidos a pasar cartas hacia adelante y hacia atrs en el correo. El tipo de socket es SOCK_DGRAM, el cual en el dominio de internet usa UDP (User Datagram Protocol).

Socket de paquete secuencial: da una conexin de dos vas, secuencial y confiable para datagramas de una longitud fija mxima. El tipo de socket es SOCK_SEQPACKET. No hay protocolo en Internet implementado para este tipo de socket.

Sockets en Visual Studio .NET [1]

La clase socket proporciona un extenso conjunto de mtodos y propiedades para las comunicaciones en red. La clase socket permite realizar transferencias de datos sincrnicas y asincrnicas mediante cualquiera de los protocolos de comunicacin incluidos en la enumeracin ProtocolType. La clase socket sigue el modelo de nomenclatura de .NET Framework para los mtodos asincrnicos; por ejemplo, el mtodo sincrnico Receive se corresponde con los mtodos asincrnicos BeginReceive y EndReceive.

Si la aplicacin slo requiere un subproceso durante su ejecucin, utilice los mtodos siguientes, diseados para el modo de funcionamiento sincrnico.

Si utiliza un protocolo basado en conexiones como TCP, el servidor podr escuchar las conexiones mediante el mtodo Listen. El mtodo Accept procesa las solicitudes de conexin entrantes y devuelve un socket que puede usar para intercambiar datos con el host remoto. Use este valor devuelto de socket para llamar al mtodo Send o Receive.

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Llame al mtodo Bind antes de llamar al mtodo Listen si desea especificar la direccin IP local y el nmero de puerto. Utilice cero como nmero de puerto si lo que desea es que el proveedor de servicios subyacente le asigne un puerto libre. Para conectar con un host de escucha, llame al mtodo Connect. Para comunicar datos, llame al mtodo Send o Receive.

Si utiliza un protocolo sin conexin como UDP, no es necesario escuchar las conexiones. Llame al mtodo ReceiveFrom para aceptar los datagramas entrantes. Utilice el mtodo SendTo para enviar datagramas a un host remoto.

Con el fin de procesar las comunicaciones mediante diferentes subprocesos durante la ejecucin, utilice los mtodos siguientes, diseados para el modo de funcionamiento asincrnico. Si utiliza un protocolo orientado a conexiones como TCP, use los mtodos socket, BeginConnect y EndConnect para conectar con un puerto de escucha. Use los mtodos BeginSend y EndSend o BeginReceive y EndReceive para comunicar datos asincrnicamente. Las solicitudes de conexin entrantes pueden procesarse mediante BeginAccept y EndAccept.

En protocolos sin conexin, como UDP, se puede utilizar BeginSendTo y EndSendTo para enviar datagramas y BeginReceiveFrom y EndReceiveFrom para recibirlos.

Si realiza varias operaciones asincrnicas en un socket, no tienen que completarse necesariamente en el orden en que se inician.

Cuando termine de enviar y recibir datos, use el mtodo Shutdown para deshabilitar socket. Despus de llamar a Shutdown, llame al mtodo Close para liberar todos los recursos asociados al socket.

Antes de que se pueda iniciar una conversacin a travs de un socket, se debe crear una canalizacin de datos entre la aplicacin y el dispositivo remoto.

TCP/IP utiliza una direccin de red y un nmero de puerto de servicio para identificar un servicio de forma exclusiva. La direccin de red identifica un dispositivo especfico en la red; el nmero de puerto identifica el servicio concreto en ese dispositivo con el que se va a establecer conexin. La combinacin de direccin de red y puerto de servicio se denomina extremo, y se representa en .NET Framework mediante la clase EndPoint. Se define un descendiente de EndPoint para cada familia de direcciones admitida; para la familia de direcciones IP, la clase es IPEndPoint.

La clase NetworkStream proporciona mtodos para enviar y recibir datos a travs de sockets de Stream en modo de bloqueo. Puede utilizar la clase NetworkStream para la transferencia de datos sincrnica y asincrnica. Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Para crear una clase NetworkStream [2], es necesario suministrar un socket conectado. Tambin se puede especificar qu permiso de tipo FileAccess tiene NetworkStream con respecto al socket proporcionado. De forma predeterminada, al cerrar NetworkStream no se cierra el socket proporcionado. Si desea que NetworkStream tenga permiso para cerrar el socket proporcionado, deber especificar true para el valor del parmetro ownsSocket.

Utilice los mtodos Write y Read (WriteLine y ReadLine) para las operaciones de E/S de bloqueo sincrnica y sencilla con un solo subproceso. Si desea procesar las operaciones de E/S mediante subprocesos independientes, considere la posibilidad de utilizar los mtodos BeginWrite y EndWrite, o los mtodos BeginRead y EndRead para la comunicacin.

Ejemplo. Desarrollar programas cliente servidor que permita mandar mensajes texto entre ambos de forma sncrona con un solo subproceso. 1. Disee las siguientes interfaces para los programas cliente y servidor (Son programas independientes)

Figura 2. Interfaz Servidor

Figura 3. Interfaz Cliente

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

2.

Establezca las propiedades Name y Text del botn a Activa_Servidor respectivamente del programa Servidor. El cdigo asociado al botn es el siguiente:

using System.Net.Sockets; using System.IO; using System.Net;

Espacios de nombre a agregar

private void Activa_Servidor_Click(object sender, EventArgs e) { IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); //Con el IpAdress.Any esuchamos en cualquier interfaz de red.. //y el 9050 es el puerto en el que escuharemos

//creamos un socket de tipo internwtwork, stream y tcp Socket newsock = new Socket(AddressFamily.InterNetwork, ProtocolType.Tcp); try { newsock.Bind(ipep); //Anclamos el socket } catch (SocketException) { //si aqui hay error es que ese puerto esta en uso y //entonces es probable que otra instancia de este programa ya este //corriendo label1 .Text corriendo"; return; } Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos = "Al parecer otra instancia del servidor ya esta al puerto especificado SocketType.Stream,

newsock.Listen(2); //Coloca el socket en estado de //escucha en el puerto especificado label1 .Text ="En espera de un cliente...";

Socket client = newsock.Accept(); //Acepta la conexion //con el cliente

if (client.Connected) //Si el cliente fue aceptado, //leer y escibir mensajes hacia el cliente {

label2.Text = "Cliente conectado"; NetworkStream networkStream = new NetworkStream(client);

//Escritura hacia el socket cliente StreamWriter streamWriter = new StreamWriter(networkStream);

string theString = "Recibiendo mensaje de servidor a cliente";

streamWriter.WriteLine(theString); streamWriter.Flush();

//Lectura desde el socket cliente StreamReader streamReader = new StreamReader(networkStream);

theString = streamReader.ReadLine(); label3.Text = theString; Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

streamReader.Close(); networkStream.Close(); streamWriter.Close();

label4.Text = "Terminada comunicacin...";

}

//cerramos el socket del cliente y del servidor client.Shutdown(SocketShutdown.Both); client.Close(); newsock.Close(); }

3. Establezca la propiedad Name a Conectar_Host y la propiedad Text a Conectar_a_Servidor respectivamente del programa Ciente. El cdigo asociado al botn es el siguiente:

using System.Net.Sockets; using System.IO; using System.Net;

Espacios de nombre a agregar

Dir. IP del servidorprivate void Conectar_Host_Click(object sender, EventArgs e)

{ IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.2.230"), 9050); //Creamos un IPEndPoint con el ip del servidor y puerto del deseamos conectarnos //servidor al que

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

//Creamos el socket igual al del servidor Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

try { server.Connect(ipep);//Intentamos conectar el //socket label1 .Text ="Conectado con el servidor " + ipep.Address; } catch (SocketException) { //Si hay excepcion imprimimos error y salimos del //programa label1 .Text ="No se pudo conectar con el servidor " + ipep.Address; return; }

NetworkStream networkStream = new NetworkStream (server); objeto NetworkStream para la transferencia de datos

// Se crea un

//Se crea un stream para lectura StreamReader streamReader = new StreamReader (networkStream);

//Se crea un stream para escritura StreamWriter streamWriter = new StreamWriter(networkStream);

try Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

{ string outputString; // Se lee los datos del cliente y los despliega

outputString = streamReader.ReadLine(); label2.Text = outputString;

//Mandando mensaje de cliente a servidor streamWriter.WriteLine("Recibiendo mensaje de cliente a servidor"); label3.Text = "Terminada comunicacin..."; streamWriter.Flush();

} catch { label3.Text = "Una exception a ocurrido desde el servidor"; } //Cerramos socket del servidor networkStream.Close();

server.Shutdown(SocketShutdown.Both); server.Close(); }

4.

Ejecute primeramente el programa Servidor seguido del programa Cliente, presione el botn Activa_Servidor para colocarlo en escucha, posteriormente conecte el cliente. Los mensajes entre Cliente y Servidor se muestran a continuacin:

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Figura 4. Conexin del cliente y recepcin de mensajes

Figura 5. Conexin hacia el servidor y recepcin de mensajes

Referencias

[1]. http://msdn.microsoft.com/es-es/library/system.net.sockets.socket(v=VS.80).aspx [2]. http://msdn.microsoft.com/es-es/library/system.net.sockets.networkstream(VS.80).aspx

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos

Elaborada por: Lic. Gabriel Coronado Garca, Lic. Javier Nolasco Hernndez, MSC Erika Rodallegas Ramos