Biblioteca de sockets genérica para .NET 8 que proporciona una capa de abstracción para comunicaciones TCP/UDP.
Última actualización: 2025-04-09
Mantenedor: Adrian Monge Mairena
Desarrollador: Jimena Castillo Campos
- Soporte para múltiples protocolos: TCP y UDP
- Operaciones asíncronas: API totalmente asíncrona basada en Task/async-await
- Recuperación automática: Reconexión y reintentos configurables
- Desacoplamiento: Lógica de procesamiento de mensajes independiente
- Extensibilidad: Arquitectura basada en interfaces para facilitar extensiones
- Manejo robusto de errores: Excepciones personalizadas y políticas de reintentos
- Configuración flexible: Opciones para personalizar el comportamiento
- .NET 8.0 o superior
- Visual Studio 2022 (para desarrollo)
- Descarga la última versión de
SocketLib.dlldesde la sección de releases - Agrega una referencia a la DLL en tu proyecto
git clone https://github.com/Preko700/SocketLib.git
cd SocketLib
dotnet build -c ReleaseLa DLL compilada estará disponible en bin/Release/net8.0/SocketLib.dll
using SocketLib.Configuration;
using SocketLib.Helpers;
using SocketLib.Interfaces;
using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;
// Implementa un manejador de mensajes
public class EchoMessageHandler : IMessageHandler
{
public Task<byte[]> HandleMessageAsync(IPEndPoint sender, byte[] message, CancellationToken cancellationToken = default)
{
string receivedText = Encoding.UTF8.GetString(message);
Console.WriteLine($"Recibido de {sender}: {receivedText}");
string response = $"Echo: {receivedText}";
return Task.FromResult(Encoding.UTF8.GetBytes(response));
}
}
// Crear y ejecutar un servidor
async Task RunServerAsync()
{
var options = new SocketOptions { MaxConnections = 10 };
var logger = new DefaultLogger();
var messageHandler = new EchoMessageHandler();
using (var server = SocketFactory.CreateTcpServer(options, logger))
{
// Eventos para conectar/desconectar clientes
server.ClientConnected += (s, e) => Console.WriteLine($"Cliente conectado: {e.RemoteEndPoint}");
server.ClientDisconnected += (s, e) => Console.WriteLine($"Cliente desconectado: {e.RemoteEndPoint}");
// Iniciar el servidor
await server.StartAsync(8080, messageHandler);
Console.WriteLine("Servidor iniciado en puerto 8080. Presiona Enter para detener.");
Console.ReadLine();
server.Stop();
}
}using SocketLib.Configuration;
using SocketLib.Helpers;
using System;
using System.Threading.Tasks;
async Task RunClientAsync()
{
var options = new SocketOptions
{
AutoReconnect = true,
RetryPolicy = new RetryPolicy { MaxRetries = 3 }
};
var logger = new DefaultLogger();
using (var client = SocketFactory.CreateTcpClient(options, logger))
{
try
{
// Conectar al servidor
await client.ConnectAsync("localhost", 8080);
Console.WriteLine("Conectado al servidor!");
// Enviar mensaje
await client.SendStringAsync("Hola, servidor!");
// Recibir respuesta
string response = await client.ReceiveStringAsync();
Console.WriteLine($"Respuesta del servidor: {response}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
finally
{
client.Disconnect();
}
}
}La biblioteca está diseñada siguiendo principios SOLID y patrones de diseño comunes:
SocketLib/
├── Interfaces/ # Contratos del API
├── Configuration/ # Opciones configurables
├── Implementation/ # Implementaciones concretas (TCP/UDP)
├── Helpers/ # Utilidades y factories
└── Exceptions/ # Excepciones personalizadas
- Principio de Responsabilidad Única (SRP): Cada clase tiene una única responsabilidad
- Principio Abierto/Cerrado (OCP): La biblioteca es extensible sin modificar el código existente
- Principio de Sustitución de Liskov (LSP): Las implementaciones son intercambiables a través de interfaces
- Principio de Segregación de Interfaces (ISP): Interfaces específicas para clientes y servidores
- Principio de Inversión de Dependencias (DIP): Dependencia de abstracciones en lugar de implementaciones concretas
- Factory:
SocketFactorypara crear instancias - Strategy:
IMessageHandlerpara personalizar el procesamiento de mensajes - Observer: Eventos para notificaciones de conexión/desconexión
- Retry Pattern: Política de reintentos configurable
ISocketClient: Operaciones del cliente (conectar, enviar, recibir)ISocketServer: Operaciones del servidor (iniciar, detener, eventos)IMessageHandler: Procesamiento de mensajesISocketLogger: Registro de eventos y errores
TcpSocketClient: Cliente TCP con reconexión automáticaTcpSocketServer: Servidor TCP multi-clienteUdpSocketClient: Cliente UDP con framing de mensajesUdpSocketServer: Servidor UDP
SocketOptions: Opciones para personalizar el comportamientoRetryPolicy: Configuración de reintentos y backoff exponencial
La solución incluye proyectos de ejemplo para probar la biblioteca:
ChatServer: Implementación de un servidor de chat simpleChatClient: Cliente de chat interactivo para consola
Para ejecutar las pruebas:
- Establece los proyectos de inicio múltiples en las propiedades de la solución
- Presiona F5 para iniciar ambos proyectos
- Sigue las instrucciones en la consola del cliente
- Aplicaciones cliente-servidor
- Servicios de comunicación en tiempo real
- Sistemas de chat y mensajería
- Servidores de juegos multijugador
- Monitoreo y telemetría
Las contribuciones son bienvenidas. Para contribuir:
- Haz fork del repositorio
- Crea una rama para tu feature (
git checkout -b feature/amazing-feature) - Realiza tus cambios
- Commitea tus cambios (
git commit -m 'Add amazing feature') - Push a la rama (
git push origin feature/amazing-feature) - Abre un Pull Request
Este proyecto está licenciado bajo la licencia Apache-2.0 - ver el archivo LICENSE para más detalles.
- Jimena Castillo Campos
- Adrian Monge Mairena
Desarrollado como parte del curso de Algoritmos y Estructuras de Datos I perteneciente al plan de estudio de la Ingeniería en Computadores (2103) del Tecnológico de Costa Rica (TEC) para el primer Semestre del 2025