Los manejamos en C# con varias clases (TcpListener, TcpClient, Socket, etc.)
A grandes rasgos lo que hacemos es que abrimos un canal de comunicación desde una IP y un puerto hacia otra IP y un puerto.
El caso es que en ocasiones podemos necesitar abrir varios hilos de comunicaciones en un mismo puerto. Imaginemos por ejemplo que somos un Servidor SMTP...
Os dejo aquí un código sencillo y muy básico que ilustra por donde hincarle el diente al tema. Se trata de un servidor escuchando en el puerto 8080:
Lo primero, nos creamos una clase Protocolo con un método llamado ManejarConexion, que será al que llamarán los hilos y será el encargado de llevar a cabo el protocolo de comunicación que establezcamos en cada una de las conexiones:
using System; using System.Text; using System.Net.Sockets; using System.Threading; namespace ServerThreads { class Protocolo { public const int BUFSIZE = 32; private Socket _conexion; public Protocolo(Socket conexion) // Constructor al que se le pasa una conexion { _conexion = conexion; } public void ManejarConexion() // Método al que llamarán los Hilos { byte[] bufferRecepcion = new byte[BUFSIZE]; int bytesRecibidos; int totalBytesRecibidos = 0; while ((bytesRecibidos = _conexion.Receive(bufferRecepcion, 0, bufferRecepcion.Length, SocketFlags.None)) > 0) { Console.Write(Encoding.ASCII.GetString(bufferRecepcion, 0, bytesRecibidos)); //Escribe carácter recibido en pantalla. totalBytesRecibidos += bytesRecibidos; } Console.WriteLine("Bytes Recibidos: {0}", totalBytesRecibidos); _conexion.Close(); } } }
Y luego multiplexamos creando un hilo cada vez que se establece una conexión:
using System; using System.Net; using System.Net.Sockets; using System.Threading; namespace ServerThreads { public class TCPServidor { static void Main(string[] args) { int puertoServidor = 8080; TcpListener servidor = new TcpListener(IPAddress.Any, puertoServidor); servidor.Start(); // Iniciamos... for (; ; ) // Permanentemente a la escucha... { Socket conexion = servidor.AcceptSocket(); // En espera hasta conexión Protocolo protocoloConexion = new Protocolo(conexion); Thread hilo = new Thread(new ThreadStart(protocoloConexion.ManejarConexion)); hilo.Start(); } } } }
Podéis probar el código con simples telnets al puerto 8080 (telnet localhost 8080), veréis como cada conexión se gestiona en un hilo o subproceso independiente. Nuestro protocolo en este caso es muy simple, dado que lo único que hace es escribir lo que recibe por pantalla, pero lógicamente podríamos definir el protocolo que queramos.