ejemplo de aplicación cliente-servidor en c#
TRANSCRIPT
Mtro José Antonio Sandoval Acosta. Docente de Ingeniería en Sistemas Computacionales. México. 18 de marzo de 2017.
Aplicación Cliente Servidor en 3 capas:
- Se tiene una aplicación cliente en consola (capa de presentación), esta sirve para
realizar la captura de la cadena que se pretende ejecutar en el SQL Server.
- La aplicación servidor es la capa de negocio o procesamiento, recibe la cadena
producida por el cliente y la ejecuta en el SQL Server por medio de los controles o
comandos apropiados, solo puede realizar Insert, Delet y Update ya que utiliza un
ExecuteNonQuery().
- El SQL Server o capa de datos en este caso sirve como repositorio de información y
por medio de queriers se puede corroborar que lo enviado desde el cliente se
ejecutó correctamente.
- Tanto el cliente como el servidor corren su proceso dentro de un ciclo, de esta forma
cuando se realiza una acción al finalizar la misma ambas aplicaciones vuelven a
estado de espera, y permanecerán así hasta que se realice otra acción o se cierren
las aplicaciones.
Mtro José Antonio Sandoval Acosta. Docente de Ingeniería en Sistemas Computacionales. México. 18 de marzo de 2017.
// Programa Servidor using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets; using System.Data.SqlClient; namespace SvrP { class Servidor { static void Main(string[] args) { Console.WriteLine("*** Server Application ***"); // Se ejecuta el Listener en un ciclo para que se repita // de forma indefinida y acepte tantas conexiones sean posibles while (true) { try { IPAddress ipAd = IPAddress.Any; // EN este caso utilizamos la dirección
// local e igual en el cliente // Inicializar Listener TcpListener myList = new TcpListener(ipAd,8001); myList.Start(); Console.WriteLine(
"Servidor corriendo en Puerto 8001..."); Console.WriteLine("Local End Point:" + myList.LocalEndpoint); Console.WriteLine("Esperando conexión..."); Socket s = myList.AcceptSocket(); Console.WriteLine("Conexión recivida desde: " + s.RemoteEndPoint); // Guardar en una variable la información
// recibida del cliente byte[] b = new byte[100]; int k = s.Receive(b); Console.WriteLine("Recievido..."); // Convierte e iprime el contenido de la cadena string cadena = ""; for (int i = 0; i < k; i++) { cadena = cadena + Convert.ToChar(b[i]); } Console.WriteLine(cadena); // Conectarse con el SQL Server string conectSQL = @"Server=.\sqlexp;database=Northwnd;"
+ " Integrated Security=TRUE"; SqlConnection cm = new SqlConnection(); cm.ConnectionString = conectSQL; cm.Open();
Mtro José Antonio Sandoval Acosta. Docente de Ingeniería en Sistemas Computacionales. México. 18 de marzo de 2017.
// Ejecutar la cadena como comando del SQL // solo aplica para Insert, Delet y
// UPdate ya que se usa ExecuteNonQuery SqlCommand cmd = new SqlCommand(cadena, cm); cmd.ExecuteNonQuery(); cm.Close(); // Enviar señal exitosa al Cliente // Esta señal puede variar dependiendo
//del proceso ejecutado ASCIIEncoding asen = new ASCIIEncoding(); s.Send(asen.GetBytes(
"Cadena recibida. Comando ejecutado")); Console.WriteLine("\nAcuse enviado"); s.Close(); myList.Stop(); } catch (Exception e) { Console.WriteLine("\nError... " + e.StackTrace); } } } } }
Mtro José Antonio Sandoval Acosta. Docente de Ingeniería en Sistemas Computacionales. México. 18 de marzo de 2017.
// Programa Cliente using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets; using System.IO; namespace CteP { class Cliente { static void Main(string[] args) { Console.WriteLine("Client Application"); while (true) { try { TcpClient tcpclnt = new TcpClient(); Console.WriteLine("Conectando....."); // utilizar para este caso IP local ya que // cliente y servidor corren en la misma PC tcpclnt.Connect("127.0.0.1", 8001); Console.WriteLine("*** Conectado con el servidor ***"); Console.Write("Introduzca frase a transmitir: "); String str = Console.ReadLine(); Stream stm = tcpclnt.GetStream(); // convertir cadena a ascii para transmitirla ASCIIEncoding asen = new ASCIIEncoding(); byte[] ba = asen.GetBytes(str); Console.WriteLine("Transmitiendo cadena..."); stm.Write(ba, 0, ba.Length); // recibir acuse, se debe converir a string byte[] bb = new byte[100]; int k = stm.Read(bb, 0, 100); string acuse = ""; for (int i = 0; i < k; i++) acuse = acuse + Convert.ToChar(bb[i]); Console.WriteLine(acuse); tcpclnt.Close(); } catch (Exception e) { Console.WriteLine("Error... " + e.StackTrace); } } } } }
Mtro José Antonio Sandoval Acosta. Docente de Ingeniería en Sistemas Computacionales. México. 18 de marzo de 2017.
Estado inicial del Cliente, el Servidor y el SQL Server con la tabla Region.
Mtro José Antonio Sandoval Acosta. Docente de Ingeniería en Sistemas Computacionales. México. 18 de marzo de 2017.
Estado final del Cliente, el Servidor y la instancia de SQL Server, tabla Region.