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
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 delegate { )).Start(); //Iniciamos el Cliente Console.WriteLine("Listo"); Console.Read(); } public void Start() { // Creamos un TcpListener y le indicamos que //puerto va a poner en escucha. //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 = StreamWriter streamWriter = StreamReader streamReader = //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
public class Client { public void Connect() { TcpClient socketForServer; string server = "localhost"; try { //Creamos un TcpCliente y le pasamos //el server y el puerto. } 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 = StreamWriter streamWriter = 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.