Explicamos cómo conectar dos PCs a través de Internet usando Socket, realizamos un ejemplo de chat entre un PC servidor y sus clientes usando Microsoft Visual Basic .Net (VB.Net) y el Namespace System.Net.Sockets. Mostramos también como comparativa cómo se realizaba una conexión por Socket usando el antiguo lenguaje de programación Visual Basic 6, mediante Winsock.

 

Socket de Internet

Con Socket se designa un concepto abstracto por el cual dos programas situados en computadoras distintas (o en la misma) pueden intercambiar cualquier flujo de datos, generalmente de manera fiable y ordenada.

El término socket es también usado como el nombre de una interfaz de programación de aplicaciones (API) para el stack de protocolos de Internet TCP/IP, provista usualmente por el sistema operativo.

Los sockets de Internet constituyen el mecanismo para la entrega de paquetes de datos provenientes de la tarjeta de red a los procesos o hilos apropiados. Un socket queda definido por un par de direcciones IP local y remota, un protocolo de transporte y un par de números de puerto local y remoto.

Para que dos programas puedan comunicarse entre sí es necesario que se cumplan ciertos requisitos:

  • Que un programa sea capaz de localizar al otro.
  • Que ambos programas sean capaces de intercambiarse cualquier secuencia de octetos, es decir, datos relevantes a su finalidad.

Para ello son necesarios los tres recursos que originan el concepto de socket:

  • Un protocolo de comunicaciones, que permite el intercambio de octetos.
  • Un par de direcciones del protocolo de red (dirección IP, si se utiliza el protocolo TCP/IP), que identifican la computadora de origen y la remota.
  • Un par de números de puerto, que identifican a un programa dentro de cada computadora.

Los sockets permiten implementar una arquitectura cliente-servidor. La comunicación debe ser iniciada por uno de los programas que se denomina programa "cliente". El segundo programa espera a que otro inicie la comunicación, por este motivo se denomina programa "servidor".

Un socket es un proceso o hilo existente en la máquina cliente y en la máquina servidora, que sirve en última instancia para que el programa servidor y el cliente lean y escriban la información. Esta información será la transmitida por las diferentes capas de red.

 

Conexión por socket en Visual Basic 6.0 y anteriores

Para las versiones de Visual Basic 6 y anteriores, si queríamos desarrollar una aplicación con conexión por socket debíamos usar el componente WinSock. Dicho componente se agregaba a Visual Basic 6 desde el menú "Proyecto" – "Componentes":

Conexión por socket en Visual Basic 6.0 y anteriores

En la pestaña "Controles" buscamos "Microsoft Winsock Control 6.0":

C:/Windows/system32/MSWINSCK.OCK

lo marcamos y pulsamos "Aceptar":

Conexión por socket en Visual Basic 6.0 y anteriores

Nos agregará un nuevo elemento a la paleta de componentes:

Conexión por socket en Visual Basic 6.0 y anteriores

 

Aplicación servidor para conexión por socket con Visual Basic 6

Mostramos a continuación un ejemplo de aplicación en Visual Basic 6 para conexión con Socket mediante Winsock, por un lado la aplicación servidor, que tendrá este aspecto:

Aplicación servidor para conexión por socket con Visual Basic 6

Una vez agregado el componente Winsock al formulario de nuestra aplicación servidor VB6 podremos programarlo, por ejemplo, para establecer el modo escucha de la que sería la aplicacion servidor, agregando un botón llamado "btEscuchar" con el siguiente código:

El evento "ConnectionRequest" del componente WinSock se ejecutará cada vez que un cliente intente establecer una conexión con el servidor, podremos colocar el siguiente código:

Para desactivar el modo escucha y cerrar todas las conexiones actuales en el servidor agregaremos el botón "btDesactivarEscucha" con el siguiente código:

Cuando el usuario pulse en el botón "Desactivar escucha", se ejecutará el evento "Close" del WinSock, desde este evento podremos controlar cuando el servidor deja de escuchar clientes:

Para agregar un botón al formulario del servidor que envíe un mensaje al cliente conectado (btEnviarMensaje) usaremos el siguiente código:

Para mostrar los mensajes enviados por los clientes al servidor, usaremos el evento "DataArrival" del componente WinSock, este evento se ejecuta cada vez que se reciben datos de algún cliente conectado:

Si se produce algún error podemos "controlarlo" con el evento "Error" del componente "WinSock", por ejemplo podríamos mostrar el error cuando se produzca y cerrar las conexiones:

Aplicación cliente para conexión por socket con Visual Basic 6

Para el caso de la aplicación cliente con VB6 y Winsock tendrá este aspecto:

Aplicación cliente para conexión por socket con Visual Basic 6

Para realizar una conexión del equipo cliente con el equipo servidor especificado en txtServidor y el puerto especifidaco en txtPuerto agregaremos el siguiente código para el botón"btConectar":

Si la conexión se ha establecido con el equipo servidor de socket, se ejecutará el evento "Connect" de Winsock, en dicho evento podremos añadir el siguiente código:

Otro evento que programaremos, cuando se pierde la conexión del cliente con el servidor, será el "Close" de Winsock, por ejemplo podremos añadir el siguiente código a este evento:

En el botón "btDesconectar" colocaremos el siguiente código, con este botón el usuario podrá desconectarse del servidor cuando lo estime pertinente:

El botón para enviar un mensaje de texto al servidor "btEnviarMensaje" tendrá el siguiente código:

Si el servidor nos envía algún mensaje, lo podremos mostrar programando el evento DataArrival del componente Winsock, con el siguiente código VB6:

Si se produce algún error podemos "controlarlo" con el evento "Error" del componente "WinSock", por ejemplo podríamos mostrar el error cuando se produzca y cerrar las conexiones:

Con los ejemplos anteriores mostramos cómo se programaba con Visual Basic 6 y anteriores una aplicación cliente-servidor mediante conexión por Socket. Como se puede observar este ejemplo, con algunos retoques, puede servir para desarrollar una aplicación de Chat. Por supuesto este tipo de conexiones entre aplicaciones, que puede ser usada en una red LAN o incluso a través de internet abriendo los puertos correspondientes en los routers o cortafuegos, permite ser usada para múltiples propósitos como por ejemplo controlar una aplicación desde otra, incluso controlar un PC desde otro.

Tal y como lo hemos programado sólo se aceptará una conexión por cada servidor, para permitir múltiples conexiones habría que usar una matriz de componentes Winsock e ir creando uno nuevo por cada conexión que se establezca. No entraremos más en detalle sobre socket con VB6 por estar este lenguaje de programación obsoleto. A continuación pasaremos a explicar los socket con VB.Net.

 

Conexión por socket en Visual Basic .Net de Visual Studio 2010

A partir de Microsoft Visual Studio .Net, Microsoft incorporó un Namespace para trabajar con Socket: System.Net.Sockets, será este Namespace el que usemos para realizar una aplicación de ejemplo que utilice Socket para conectar dos PCs a través de Internet o de la red LAN y enviar mensajes de texto (o incluso enviar ficheros) entre uno y otro.

Sin duda el namespace System.Net.Sockets es mucho más "potente" que el antiguo Winsock, proporciona más funciones, propiedades, eventos y métodos y más eficientes. Aunque echamos de menos que todo esto no esté implementando en un componente, lo cual facilitaría bastante las cosas, como ocurre con la antigua versión de Borland Delphi 6, que incluía un componente para Socket con todas las opciones para una sencilla programación. Por ejemplo la aplicación de AjpdSoft Chat, bastante profesional, ha sido desarrollada con Delphi 6 y estos componentes (ClientSocket y ServerSocket):

AjpdSoft Chat UDP código fuente en Delphi

También AjpdSoft Aviso cambio IP pública usa socket para conexión entre el usuario y el servidor donde se guardan las IPs. O la aplicación AjpdSoft Transferencia de ficheros que envía ficheros entre PCs mediante socket.

Volviendo a Microsoft Visual Studio .Net, utilizaremos Visual Basic .Net VB.Net para conectar dos equipos mediante Socket. A continuación explicaremos cómo desarrollar la aplicación servidor y la aplicación cliente. Veremos que es un poco "arduo" debido a que no incorpora un componente para este menester.

 

Aplicación servidor para conexión por socket con Visual Basic .Net

En la aplicación servidor agregaremos los siguientes componentes:

Aplicación servidor para conexión por socket con Visual Basic .Net

Agregaremos una clase a nuestro proyecto AjpdSoftSocketServidor, en esta clase que llamaremos "ClaseServidorSocket" agregaremos el código necesario para interactuar con el Namespace System.Net.Sockets:

A continuación mostramos el código completo para el formulario de la aplicación AjpdSoft Socket VB.Net Servidor, en el código incluimos los eventos necesarios, el botón "Escuchar", el botón "Detener escucha" y el botón "Enviar datos":

Aplicación cliente para conexión por socket con Visual Basic .Net

En la aplicación cliente agregaremos los siguientes componentes:

Aplicación cliente para conexión por socket con Visual Basic .Net

Agregaremos una clase a nuestro proyecto AjpdSoftSocketCliente, en esta clase que llamaremos "ClaseClienteSocket" agregaremos el código necesario para interactuar con el Namespace System.Net.Sockets:

A continuación mostramos el código completo para el formulario de la aplicación AjpdSoft Socket VB.Net Servidor, en el código incluimos los eventos necesarios, el botón "Escuchar", el botón "Detener escucha" y el botón "Enviar datos":

AjpdSoft Socket VB.Net en funcionamiento

A continuación mostramos cómo funciona la aplicación a AjpdSoft Socket VB.Net, por un lado iniciaremos la parte Servidor, introduciremos el puerto a usar para las conexiones (debe estar libre), en nuestro caso usaremos el 1010 y pulsaremos "Escuchar":

AjpdSoft Socket VB.Net en funcionamiento

La aplicación Servidor quedará en modo escucha, esperando la conexión de los clientes, si el puerto está usado ya por otra aplicación mostrará un error, si el puerto está libre activará el botón "Enviar a todos":

AjpdSoft Socket VB.Net en funcionamiento

Iniciaremos la aplicación Cliente, en esta aplicación deberemos indicar la IP o nombre de red (hostname) del equipo que tiene la aplicación Servidor, incluso podremos establecer la conexión a través de Internet si hemos redireccionado correctamente el puerto usado en el router o cortafuegos. En nuestro caso usaremos la IP 127.0.0.1 debido a que la aplicación Servidor y Cliente están en el mismo equipo. Introduciremos el mismo puerto con el que hemos activado la escucha en el Server, el 1010 y pulsaremos "Conectar":

AjpdSoft Socket VB.Net en funcionamiento

Si todo es correcto y el Servidor recibe la conexión, la aplicación Servidor mostrará "Conectado cliente …":

AjpdSoft Socket VB.Net en funcionamiento

Para enviar un mensaje al Servidor lo escribiremos en "Mensaje" y pulsaremos "Enviar":

AjpdSoft Socket VB.Net en funcionamiento

En el Servidor se habrá recibido el mensaje enviado por el Cliente, si queremos enviar un mensaje del servidor a todos los clientes conectados lo escribiremos y pulsaremos en "Enviar a todos":

AjpdSoft Socket VB.Net en funcionamiento

Los clientes conectados recibirán el mensaje enviado desde el Servidor:

AjpdSoft Socket VB.Net en funcionamiento

 

Artículos relacionados

  

Créditos

Artículo realizado íntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft.

Artículo en inglés.