Blog de Página Web Leon

Sockets para internet, definición y ejemplos

Sockets de internet se refiere a la tecnología de comunicación entre dos aplicaciones por medio del protocolo TCP/IP o algún otro protocolo de transporte y un puerto para cada aplicación. Esta arquitectura entra en el modelo cliente-servidor donde la aplicación local gestiona a una aplicación remota para el envío de mensajes y recepción de respuestas. Afortunadamente, los sistemas operativos tienen implementadas las API’s (Interfaz de Programación de Aplicaciones) que reducen en mucho el desarrollo de comunicación entre aplicaciones.

La aplicación remota o servidor se encuentra en un estado de espera, aguardando a que alguna aplicación inicie la comunicación, cuando la aplicación local envía una petición se inicia el ciclo de comunicación. La aplicación cliente es siempre quien inicia este ciclo.

Ejemplo de comunicación por sockets

Vamos a crear un ejemplo sencillo donde se usen sockets, tendremos una aplicación cliente que consultará una aplicación servidor para enviar un mensaje. Dicho mensaje será interpretado en el servidor y enviará una respuesta al cliente. Usaremos la plataforma Visual Studio 2010 y el lenguaje de programación C# para crear ambas soluciones y las generaremos en aplicaciones para consola.

Servidor

  1. Abramos el Visual Studio 2010
  2. Vayamos al menú ArchivoNuevoProyecto
  3. En la ventana que se abrió, seleccionemos del lado izquierdo el ítem Otros Lenguajes – Visual C#Windows. En la parte central de la misma ventana busquemos el ítem Aplicación de consola C#
  4. En la caja de texto en la parte final, escribamos en el nombre: Servidor
  5. Demos un clic en el botón Aceptar para crear nuestra solución
  6. Inmediatamente se abrirá el archivo que contiene nuestra clase principal al que se nombra por default cs
  7. En nuestra área de trabajo aparece el código del archivo cs como a continuación se muestra:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Servidor
    {
        class Program
        {
            static void Main(string[] args)
            {
            }
        }
    }
  8. Vamos a agregar la clase .Net y la .Net.Sockets para poder usarlos. Modificaremos el código y quedará como se muestra a continuación:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    
    namespace Servidor
    {
     class Program
     {
     // Entran datos desde el cliente
     public static string data = null;
    
     public static void StartListening()
     {
     // Búfer de datos para la información entrante
     byte[] bytes = new Byte[1024];
    
     // Establece el punto final local del socket
     // Dns.GetHostName regresa el nombre del 
     // host que ejecuta la aplicación
     IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
     IPAddress ipAddress = ipHostInfo.AddressList[0];
     Console.WriteLine("Direccion IP: " + ipAddress);
     IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 360);
    
     // Crea un socket TCP/IP
     Socket listener = new Socket(AddressFamily.InterNetwork,
     SocketType.Stream, ProtocolType.Tcp);
    
     // Enlaza el socket para el punto final local y 
     // escucha las conexiones entrantes
     try
     {
     listener.Bind(localEndPoint);
     listener.Listen(10);
    
     // Comienza a escuchar las conexiones
     while (true)
     {
     Console.WriteLine("Esperando por una conexion...");
     // El programa está suspendido esperando una conexión entrante
     Socket handler = listener.Accept();
     data = null;
    
     // Una conexión entrante necesita ser procesada
     while (true)
     {
        bytes = new byte[1024];
        int bytesRec = handler.Receive(bytes);
        data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
        if (data.IndexOf("<EOF>") > -1)
        {
           break;
        }
     }
    
     // Muestra la información en la consola
     Console.WriteLine("Texto recibido : {0}", data);
    
     // Regresa la información hacia el cliente
     byte[] msg = Encoding.ASCII.GetBytes("Regreso tu mensaje: " + data);
    
        handler.Send(msg);
        handler.Shutdown(SocketShutdown.Both);
        handler.Close();
     }
    
     }
     catch (Exception e)
     {
        Console.WriteLine(e.ToString());
     }
    
     Console.WriteLine("\nPresione ENTER para continuar...");
     Console.Read();
     }
    
     public static int Main(String[] args)
     {
     StartListening();
     return 0;
     }
     }
    }
  9. En el código anterior, se explica en los comentarios la función de cada instrucción

Cliente

  1. Abramos el Visual Studio 2010
  2. Vayamos al menú ArchivoNuevoProyecto
  3. En la ventana que se abrió, seleccionemos del lado izquierdo el ítem Otros Lenguajes – Visual C#Windows. En la parte central de la misma ventana busquemos el ítem Aplicación de consola C#
  4. En la caja de texto en la parte final, escribamos en el nombre: Cliente
  5. Demos un clic en el botón Aceptar para crear nuestra solución
  6. Inmediatamente se abrirá el archivo que contiene nuestra clase principal al que se nombra por default cs
  7. En nuestra área de trabajo aparece el código del archivo cs como a continuación se muestra:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Cliente
    {
        class Program
        {
            static void Main(string[] args)
            {
            }
        }
    }
  8. Vamos a agregar la clase .Net y la .Net.Sockets para poder usarlos. Modificaremos el código y quedará como se muestra a continuación:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    
    namespace Cliente
    {
     class Program
     {
     public static void StartClient()
     {
     // Búfer para datos entrantes.
     byte[] bytes = new byte[1024];
    
     // Conexion al dispositivo remoto.
     try
     {
     // Establece el punto final remoto para el socket.
     // Este ejemplo usa el puerto 360 para la computadora local.
     IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
     IPAddress ipAddress = ipHostInfo.AddressList[0];
     IPEndPoint remoteEP = new IPEndPoint(ipAddress, 360);
    
     // Crea un socket TCP/IP
     Socket sender = new Socket(AddressFamily.InterNetwork,
     SocketType.Stream, ProtocolType.Tcp);
    
     // Conecte el socket a la terminal remota y detecta cualquier error.
     try
     {
     sender.Connect(remoteEP);
    
     Console.WriteLine("Socket conectado a {0}",
     sender.RemoteEndPoint.ToString());
    
     // Codifica la cadena de datos en una matriz de bytes.
     byte[] msg = Encoding.ASCII.GetBytes("'Mensaje del cliente' <EOF>");
    
     // Envía los datos a través del socket
     int bytesSent = sender.Send(msg);
    
     // Recibe la respuesta del dispositivo remoto
     int bytesRec = sender.Receive(bytes);
     Console.WriteLine("Respuesta del servidor -> {0}",
     Encoding.ASCII.GetString(bytes, 0, bytesRec));
    
     // Suelta el socket.
     sender.Shutdown(SocketShutdown.Both);
     sender.Close();
    
     }
     catch (ArgumentNullException ane)
     {
     Console.WriteLine("Argumento de Excepcion : {0}", ane.ToString());
     }
     catch (SocketException se)
     {
     Console.WriteLine("Socket de Excepcion : {0}", se.ToString());
     }
     catch (Exception e)
     {
     Console.WriteLine("Excepcion inesperada : {0}", e.ToString());
     }
    
     }
     catch (Exception e)
     {
     Console.WriteLine(e.ToString());
     }
     }
    
     public static int Main(String[] args)
     {
     StartClient();
     Console.Read();
     return 0;
     }
     }
    }

Pruebas

  1.  Echemos a andar el servidor, se pondrá en escucha en espera de un mensaje para procesarlo:

    Consola donde se muestra la aplicación servidor esperando comunicación

    Fig. 1.1 Consola donde se muestra la aplicación servidor esperando comunicación

  2. Ahora lancemos el cliente para que intente comunicarse con el servidor, y veamos la consola para revisar la respuesta:

    Consola ejecutando la aplicación cliente

    Fig. 1.2 Consola ejecutando la aplicación cliente

  3. Vemos en la consola que el servidor contestó inmediatamente. La primer línea indica la conexión donde está el servidor según la dirección IP y el puerto donde trabaja la aplicación remonta, en la segunda línea vemos que devolvió el mismo mensaje que le enviamos desde el cliente. Veamos que pasó en la aplicación servidor después de éste evento:

    Aplicación servidor procesando una petición del cliente

    Fig. 1.3 Aplicación servidor procesando una petición del cliente

  4. Vemos que aparecen cuatro líneas, las dos primeras aparecieron cuando echamos a andar el servidor. Las dos últimas líneas corresponden a la comunicación que hubo con el cliente, recibe correctamente el  mensaje e inmediatamente se cambia a estado de escucha para atender otro mensaje.
  5. Cuando generamos la aplicación desde Visual Studio 2010 se crean muchos archivos y carpetas con un fin específico. Los archivos .exe se generan en la carpeta bin, dentro de otras carpetas. En la siguiente imagen, veremos la ruta para la aplicación cliente:

    Ruta de los archivos para encontrar el ejecutable

    Fig. 1.4 Ruta de los archivos para encontrar el ejecutable

  6. Ahora vamos a cerrar el servidor para terminarlo y lancemos el cliente. Como no colocamos un manejo de excepción mostrará un error en la pantalla. Esto ocurre porque no se detecto alguna aplicación que escuche la petición del cliente:

    Error producido al no encontrar servicio

    Fig. 1.5 Error producido al no encontrar servicio

Los sockets son muy usados actualmente, una o varias aplicaciones acceden a un equipo por medio de esta tecnología sin importar el sistema operativo. Ofrecen grandes beneficios y facilitan el trabajo del programador.

3 Comentarios

  1. Rapid Advance

    Rapid Advance Rapid Advance Rapid Advance Rapid
    Advance Rapid Advance Rapid Advance Rapid Advance Rapid Advance Rapid Advance Rapid Advance

  2. http://bit.do/4FfJ

    After all how do someone enjoy a game in the event it wont even allow you to play it?
    Just too large news for Xbox 360 console minecraft Fans. All in all, I visualize it as a successful system.
    http://bit.do/4FfJ

  3. bestdatingsitesnow.com

    After exploring a number of the blog articles on your site,
    I seriously appreciate your technique of blogging.
    I bookmarked it to my bookmark site list and will be checking back soon. Please visit my website
    too and tell me how you feel.

Dejar un comentario