Servidor genérico basado en sockets para .NET 3.5

El entorno computacional actual ofrece las más diversas opciones para el desarrollo de aplicaciones interconectadas.  Los programadores nuevos nacieron con el concepto de “alto nivel” y las tecnologías como el lenguaje ensamblador y la comunicación por sockets forman parte del paleolítico de la computación, en el mejor de los casos, son simplemente como los átomos, elementos constituyentes que siempre han existido y nunca morirán, pero de los cuales no tendrán nunca que preocuparse.  Por ejemplo, .NET ofrece Windows Communication Foundation (WCF), una super interfaz de muy alto nivel para la creación de aplicaciones orientadas a servicios, donde cada cliente puede acceder a múltiples servicios y cada servicio puede ser accedido desde múltiples clientes.

Sin embargo, aún en la actualidad todavía se presentan infinidad de proyectos que requieren tocar de cerca los metales y usar los “viejos” sockets. Al menos tres elementos pueden justificar esta decisión:

  • Eficiencia: las bibliotecas como WCF brindan una serie de abstracciones que permiten concentrarse en el procesamiento específico del dominio de trabajo y nos aislan de los detalles subyacentes de los protocolos de comunicación a más bajo nivel, pero esto ocurre a expensas de la adición de encabezados extra, conversión bidireccional a XML y en general el soporte de los protocolos específicos para el estándar de servicios web.  Si nuestro sistema requiere procesar miles de solicitudes cada segundo, entonces evidentemente una implementación con sockets será mucho más eficiente.
  • Compatibilidad entre plataformas: WCF está diseñado principalmente para conectar aplicaciones entre sistemas Windows.  Si estamos creando un servidor cuyos clientes pueden ser sistemas basados en Linux u otro sistema que no implemente los protocolos que expone WCF, entonces nuevamente tendremos que acudir a los sockets.
  • Madurez y completitud: he tomado WCF como ejemplo para la comparación pues, aunque existen otras bibliotecas, esta es la más conocida en el ámbito de .NET, pero me atrevo a especular que el resto en mayor o menor medida (incluyendo mi propio server genérico expuesto en este mismo post) sufren de las limitaciones expuestas aquí.  Como toda abstracción, WCF expone al desarrollador los elementos que sus creadores consideran más importantes de las capas que están por debajo y ello implica que siempre algo que pudieramos necesitar usar pudiera quedarse fuera.  Por ejemplo, cuando comencé a investigar WCF en la versión 3, algo tan simple como obtener la dirección IP del cliente era imposible, en la 3.5 ya se puede, pero de todas formas al menos para mi gusto, de forma demasiado verbosa.

Algunas desventajas de usar sockets:

  • Requiere la definición de un protocolo propio:  los sockets solo saben enviar y recibir arreglos de bytes, luego es necesario diseñar y programar la lógica que le impregna semántica a esos bytes y los convierte en un protocolo nuevo.  Esto, para cada servidor que construyamos con sockets.
  • Mayor dificultad:  al trabajar con el socket que es un elemento a más bajo nivel, se incrementa la dificultad, pues la libertad de acción se convierte en un arma de doble filo, por una parte abre un mundo de posibilidades y flexibilidad, pero por el otro nos responsabiliza con cada detalle del mecanismo, incluyendo el manejo completo de errores.

Luego de estos antecedentes … SI, este post habla de la programación con sockets en C#, especificamente a partir de la versión 3.5 de la plataforma, la primera que permite escribir en .NET servidores de alto desempeño.  Además pongo a disposición de los colegas una pequeña abstracción construída sobre esta tecnología que al menos personalmente me ha sido muy útil para aumentar la productividad en un proyecto en el cual he tenido que construir prácticamente “servidores en serie”. El código que refleja las ideas para el servidor genérico que se expone a continuación, se puede descargar aqui.

Leer más de esta entrada

Anuncios

Honor a quien honor merece

Nuevo busto develado en honor al Coronel Ramón Barquin en la American Military Academy en Puerto Rico.

Quien vive el presente mirando al pasado no puede caminar hacia el futuro”

Ramón Barquin