Últimamente ando liado con una aplicación cliente-servidor que requiere una comunicación en tiempo real del cliente con el servidor. Para agilizar esta comunicación pensé en utilizar sockets y aquí os paso un ejemplo de una simple aplicación tanto del lado del cliente como del lado del servidor.
Del lado del servidor necesitamos quedar a la espera, en un puerto libre que no esté reservado por el sistema, de una petición de conexión del cliente. Una vez que el cliente realice una conexión con el servidor, se estable un socket entre ambos por el cual se puede transferir la información que sea necesaria.
Código del lado del servidor:
using System;
using System.Net.Sockets;
using System.IO;
namespace ConsoleApplicationSocketServer
{
public class Program
{
public static void Main(string[] args)
{
//Puerto donde escuchará la aplicación servidora
int puerto=10;
Console.WriteLine("Servidor lanzado. Esperando conexión del cliente...");
//Se abre un puerto de escucha.
TcpListener tcpListener = new TcpListener(puerto);
tcpListener.Start();
//El Servidor espera a que se conecte el cliente.
Socket socketForClient = tcpListener.AcceptSocket();
if (socketForClient.Connected)
{
Console.WriteLine("Cliente conectado correctamente.");
//Stream por donde se recibirá y enviará información al cliente.
NetworkStream networkstream = new NetworkStream(socketForClient);
StreamWriter streamWriter = new StreamWriter(networkstream);
StreamReader streamReader = new StreamReader(networkstream);
string dato = "Dato enviado desde el servidor";
//Enviamos información al cliente.
streamWriter.WriteLine(dato);
Console.WriteLine("Dato enviado al cliente");
streamWriter.Flush();
//Recibimos información del cliente.
dato = streamReader.ReadLine();
Console.WriteLine(dato);
//Cerramos los recursos abiertos.
streamWriter.Close();
streamReader.Close();
networkstream.Close();
}
//Cerramos el socket con el cliente.
socketForClient.Close();
Console.WriteLine("Cerrando aplicación. Pulse una tecla para finalizar");
Console.ReadKey();
}
}
}
En la parte del cliente simplemente necesitamos realizar una conexión con el servidor estableciendo el host y puerto donde está hospedada la aplicación servidora. A partir de ahí simplemente utilizaremos el socket creado para enviar y recibir información del servidor.
Código del lado del cliente:
using System;
using System.Net.Sockets;
using System.IO;
namespace ConsoleApplicationSocketCliente
{
public class Program
{
public static void Main(string[] args)
{
//Puerto del servidor.
int puerto = 10;
//Host del servidor.
string host = "localhost";
TcpClient socketForServer;
try
{
//Establecemos socket con el servidor.
socketForServer = new TcpClient(host, puerto);
}
catch
{
Console.WriteLine("Error conectando con el servidor {0}. Pulse una tecla para finalizar...",host);
Console.ReadKey();
return;
}
//Flujo de envio y recepción de datos al servidor
NetworkStream networkStream = socketForServer.GetStream();
//Para escribir datos en el flujo.
StreamWriter streamWriter = new StreamWriter(networkStream);
//Para leer datos del flujo.
StreamReader streamReader = new StreamReader(networkStream);
try
{
string dato;
//Recibimos damos del servidor.
dato = streamReader.ReadLine();
Console.WriteLine(dato);
//Enviamos datos al servidor
streamWriter.WriteLine("Mensaje recibido en el cliente");
streamWriter.Flush();
}
catch
{
Console.WriteLine("Error recibiendo del servidor. Pulse una tecla para finalizar...");
Console.ReadKey();
}
//Cerramos los recursos abiertos.
streamReader.Close();
streamWriter.Close();
networkStream.Close();
Console.ReadKey();
}
}
}
La consola de salida de la aplicación servidora sería la siguiente:
La consola de salida de la aplicación cliente sería la siguiente:
