Programación de Base de Datos
Unidad 2: Apps con arquitectura cliente-servidor
Ejemplo de aplicación cliente-servidor en C# utilizando conexiones TCP/IP
Tanto el cliente como el servidor están desarrollados en consola
1. 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.
2. 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();
3. 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);
}
}
}
}
}
4. 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);
}
}
}
}
}
5. 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.
6. 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.