Hace dos meses, escribí un post implementando un servidor HTTP mínimo en Java:
Un Servidor Http Mínimo en Java
En estos días, comencé a explorar node.js. Quiero implementar un servidor mínimo en AjSharp que mapee pedidos entrantes a funciones dinámincas, a la node.js/javascript. Pero antes de eso, quiero una implementación pura y mínima en C#. Podría usar TcpListener (similar al ServerSocket de Java) , como en el proyecto del 2001:
Create your own Web Server using C#
Pero en .NET, tenemos un web listener mínimo en la clase System.Net.HttpListener. Ver:
HttpListener for dummies: a simple “HTTP Request” reflector
Así, que usando esa clase, escribí un código de consola, mínimo:
class Program
{
static string rootDirectory;
static void Main(string[] args)
{
rootDirectory = args[0];
HttpListener listener = new HttpListener();
for (int k = 1; k < args.Length; k++)
listener.Prefixes.Add(args[k]);
listener.Start();
while (true)
{
HttpListenerContext context = listener.GetContext();
Process(context);
}
}
private static void Process(HttpListenerContext context)
{
string filename = context.Request.Url.AbsolutePath;
Console.WriteLine(filename);
filename = filename.Substring(1);
if (string.IsNullOrEmpty(filename))
filename = "index.html";
filename = Path.Combine(rootDirectory, filename);
Stream input = new FileStream(filename, FileMode.Open);
byte[] buffer = new byte[1024*16];
int nbytes;
while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0)
context.Response.OutputStream.Write(buffer, 0, nbytes);
input.Close();
context.Response.OutputStream.Close();
}
}
El web server retorna el contenido de archivos estáticos, desde un directorio raíz. El primer parámetro es el directorio raíz, y el resto de los parámetros son los patrones a escuchar:
El resultado, usando archivos estáticos que tengo en directorio de documentación de Tomcat:
La salida por consola:
Próximos pasos: usar este código en AjSharp. O extenderlo para soportar un pool de threads, o atender llamadas como /run/<comandoaejecutar> en el servidor.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez