Una red de computadoras (ordenadores) consiste en máquinas interconectadas mediante canales de comunicación. Estas máquinas son Hosts y Routers. Los Hosts son computadoras que ejecutan aplicaciones, por ejemplo un navegador. Los Routers son equipos cuyo trabajo es retransmitir información de un canal de comunicación a otro. Estos pueden ejecutar programas, pero normalmente no son aplicativos. Para este post un canal de comunicación es un medio de transmisión de secuencias de bytes de un host a otro, este puede ser broadcast, como Ethernet, un modem dial-up, o algo más sofisticado.
Otro término que tenemos que definir es Protocolo. Un protocolo es un acuerdo acerca de los paquetes intercambiados por comunicación de los programas y lo que significan, además describe como está estructurado, por ejemplo: donde está la información del destinatario en el paquete y de que tamaño es. Un ejemplo es Http (Hypertext Transfer Protocol) que resuelve el problema de transferir objectos hipertexto entre servidores y hacerlo entendible por personas.
Ahora vamos directo al grano: ¿Qué es un Socket?
Un socket es una abstracción que permite a la aplicación "enchufarse" a la red para poder recibir y enviar data. Los principales tipos de socket hoy en día son los Stream Socket y los Datagram Socket. Los Stream Sockets utilizan TCP e IP para proveer n servicio confiable. Los Datagram Sockets usan UDP.
Otro concepto importante son el Stream Reader y el Stream Writer.
Son clases que nos ayudan a escribir y leer del buffer del socket. Sino existieran habría que leer el buffer y escribir en él directamente, cosa que es un poco engorrosa e innecesaria para la mayoría de las aplicaciones.
Código de ejemplo:
Codigo Servidor
Codigo Cliente
Esto es un demo muy básico, pero funciona correctamente. Se le pueden añadir funcionalidades como multithreading para poder aceptar a varios clientes al mismo tiempo.
Otro término que tenemos que definir es Protocolo. Un protocolo es un acuerdo acerca de los paquetes intercambiados por comunicación de los programas y lo que significan, además describe como está estructurado, por ejemplo: donde está la información del destinatario en el paquete y de que tamaño es. Un ejemplo es Http (Hypertext Transfer Protocol) que resuelve el problema de transferir objectos hipertexto entre servidores y hacerlo entendible por personas.
Ahora vamos directo al grano: ¿Qué es un Socket?
Un socket es una abstracción que permite a la aplicación "enchufarse" a la red para poder recibir y enviar data. Los principales tipos de socket hoy en día son los Stream Socket y los Datagram Socket. Los Stream Sockets utilizan TCP e IP para proveer n servicio confiable. Los Datagram Sockets usan UDP.
Otro concepto importante son el Stream Reader y el Stream Writer.
Son clases que nos ayudan a escribir y leer del buffer del socket. Sino existieran habría que leer el buffer y escribir en él directamente, cosa que es un poco engorrosa e innecesaria para la mayoría de las aplicaciones.
Código de ejemplo:
Codigo Servidor
Código (csharp) [Seleccionar]
public class NetworkServer
{
public static void Main()
{
//creamos un thread para que el server
//se ejecute en paralelo con el cliente
//esto es solo por motivos prácticos del demo
new Thread(new ThreadStart(
delegate {
new NetworkServer().Start(); }
)).Start();
//Iniciamos el Cliente
new Client().Connect();
Console.WriteLine("Listo");
Console.Read();
}
public void Start()
{
// Creamos un TcpListener y le indicamos que
//puerto va a poner en escucha.
TcpListener tcpListener = new TcpListener(9898);
//Iniciamos la esucha
tcpListener.Start();
//Este método queda bloqueado hasta que
//se conecte un cliente
Socket socketForClient = tcpListener.AcceptSocket();
if (socketForClient.Connected)
{
// Si se conecta
Console.WriteLine("Cliente conectado.");
//Creamos el networkSream, el Reader y el writer
NetworkStream networkStream =
new NetworkStream(socketForClient);
StreamWriter streamWriter =
new StreamWriter(networkStream);
StreamReader streamReader =
new StreamReader(networkStream);
//Esta es la data a enviar.
string theString = "Esta es la data de envio";
try
{
//Escribimos la data en el stream
streamWriter.WriteLine(theString);
//Ahora le decimos que la mande.
streamWriter.Flush();
//Esperamos data del cliente
//Y la escribimos por consola.
theString = streamReader.ReadLine();
Console.WriteLine(theString);
}
finally
{
//Cerramos las conexiones
streamReader.Close();
streamWriter.Close();
networkStream.Close();
socketForClient.Close();
}
}
}
}
Codigo Cliente
Código (csharp) [Seleccionar]
public class Client
{
public void Connect()
{
TcpClient socketForServer;
string server = "localhost";
try
{
//Creamos un TcpCliente y le pasamos
//el server y el puerto.
socketForServer = new TcpClient(server, 9898);
}
catch
{
Console.WriteLine(
"No se pudo conectar a {0}:9898", server);
return;
}
//aqui es lo mismo que en el server. Usamos StreamWriter y Reader.
NetworkStream networkStream = socketForServer.GetStream();
StreamReader streamReader =
new System.IO.StreamReader(networkStream);
StreamWriter streamWriter =
new System.IO.StreamWriter(networkStream);
try
{
string outputString = streamReader.ReadLine();
Console.WriteLine(outputString);
streamWriter.WriteLine("Mensaje desde el Cliente");
streamWriter.Flush();
}
catch
{
Console.WriteLine("Exception reading from Server");
}
finally
{
networkStream.Close();
}
}
}
Esto es un demo muy básico, pero funciona correctamente. Se le pueden añadir funcionalidades como multithreading para poder aceptar a varios clientes al mismo tiempo.