comunicacion-tcp-con-c

Comunicación TCP con C#

En esta entrada vamos a establecer una conexión entre dispositivos mediante TCP con C#, aprovechando la potencia y versatilidad que nos brinda el framework .NET. La comunicación TCP es una de las formas más sencillas y convenientes para transmitir información en sistemas en red.

Las aplicaciones de este tipo de comunicación son infinitas. Podemos enviar alertas ante eventos, registrar datos capturados de forma remota, monitorizar sistemas, o controlar un sistema a distancia, o incluso comunicar varias máquinas virtualizadas. Todo ello como ejemplos entre un sin fin de aplicaciones tanto en automatización como en informática.

Para conectar establecer nuestra conexión TCP necesitaremos dos programas distintos:

  • Un TCP Server, que es el programa que escucha y recoge las comunicaciones.
  • Uno o varios TCP Client, que son los programas que inician la comunicación con un TCP Server, que debe estar previamente a al escucha.

Una de las primeras tareas en nuestro diseño será determinar que subsistema asumirá cada función. será determinar cual de tus subsistemas asume la función de Server y cual la de Client.

Por último, se dan por supuesto ciertos aspectos básicos de telecomunicaciones, cómo que es necesario tener visibilidad entre dispositivos, conocer sus IP’s (al menos del TCP Server), tener los puertos abiertos y, en caso necesario, correctamente enrouteados. Para las pruebas podemos usar un único equipo usando la dirección de localhost, 127.0.0.1)

TCP Server

El TCP Server se inicia en primer lugar, quedando a la escucha en un rango de IP’s y en un determinado puerto. En nuestro caso configuramos el TCP Server para admitir conexiones desde cualquier IP, y en el puerto 8010.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace TCPExample
{
    class TCPServer
    {
        public TCPServer()
        {
            try
            {
                TcpListener myList = new TcpListener(IPAddress.Any, 8010);
                myList.Start();

                Console.WriteLine("Server running at port 8001...");
                Console.WriteLine("Waiting for a connection...");

                Socket s = myList.AcceptSocket();
                Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);

                byte[] b = new byte[100];
                int k = s.Receive(b);
                Console.WriteLine("Recieved...");
                for (int i = 0; i < k; i++)
                    Console.Write(Convert.ToChar(b[i]));

                ASCIIEncoding asen = new ASCIIEncoding();
                s.Send(asen.GetBytes("The string was recieved by the server."));
                Console.WriteLine("\nSent Acknowledgement");
                /* clean up */
                s.Close();
                Console.Read();
                myList.Stop();

            }
            catch (Exception e)
            {
                Console.WriteLine("Error: " + e.StackTrace);
                Console.Read();
            }
        }

    }
}

TCP Client

El TCP Client inicia la comunicación estableciendo una conexión con el TCP Server. Para ello tenemos que indicar la IP y puerto en el que se está ejecutando el TCP Client. En este caso, guardamos la dirección IP del TCP Server en un fichero de configuración llamado “conf.ini” que ubicaremos en la misma carpeta que el TCP Client.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace TCPExample
{
    class TCPClient
    {
        public TCPClient()
        {
            try
            {
                string ip;
                using (System.IO.StreamReader file = new System.IO.StreamReader("conf.ini"))
                {
                    ip = file.ReadLine();
                }

                IPAddress ipAd = IPAddress.Parse(ip);       

                TcpClient tcpclnt = new TcpClient();
                Console.WriteLine("Connecting...");

                tcpclnt.Connect(ip, 8010);

                Console.WriteLine("Connected");
                Console.Write("Enter the string to be transmitted : ");

                String str = Console.ReadLine();
                Stream stm = tcpclnt.GetStream();

                ASCIIEncoding asen = new ASCIIEncoding();
                byte[] ba = asen.GetBytes(str);
                Console.WriteLine("Transmitting...");

                stm.Write(ba, 0, ba.Length);

                byte[] bb = new byte[100];
                int k = stm.Read(bb, 0, 100);

                for (int i = 0; i < k; i++)
                    Console.Write(Convert.ToChar(bb[i]));

                Console.Read();
                tcpclnt.Close();
            }

            catch (Exception e)
            {
                Console.WriteLine("Error: " + e.StackTrace);
                Console.Read();
            }
        }
    }
}